Python Textacy pos_regex_匹配与匹配
我正试图用python在一个句子中找到一个用于NLP问题的动词。我在stackoverflow上找到了一个旧答案,它适用于不推荐的pos_regex_匹配。使用新的matches函数,我遇到了一个相当无聊的问题。新函数返回任何匹配,而不仅仅是最长的匹配(pos_regex_匹配)Python Textacy pos_regex_匹配与匹配,python,spacy,textacy,Python,Spacy,Textacy,我正试图用python在一个句子中找到一个用于NLP问题的动词。我在stackoverflow上找到了一个旧答案,它适用于不推荐的pos_regex_匹配。使用新的matches函数,我遇到了一个相当无聊的问题。新函数返回任何匹配,而不仅仅是最长的匹配(pos_regex_匹配) pattern=r'**' 动词形式=[{“POS”:“动词”,“OP”:“*”},{“POS”:“ADV”,“OP”:“*”},{“POS”:“动词”,“OP”:“+”},{“POS”:“部分”,“OP”:“*”}]
pattern=r'**'
动词形式=[{“POS”:“动词”,“OP”:“*”},{“POS”:“ADV”,“OP”:“*”},{“POS”:“动词”,“OP”:“+”},{“POS”:“部分”,“OP”:“*”}]
t_list_1=textacy.extract.pos_regex_匹配(文本,模式)
t_list_2=textacy.extract.matches(文本、动词模式)
正如您所看到的,模式是相同的,但是matches函数的模式是新格式的。
旧的pos_regex_匹配返回,例如,正在庆祝
,而新的匹配同时返回在庆祝
和在庆祝
。
有人遇到过同样的问题吗?是模式问题还是文本问题
提前谢谢我也有同样的问题。虽然我还没有找到一个标志来允许表达式的贪婪匹配返回最长的匹配,而不是子部分,但我已经编写了这段代码,手动删除了非最大的匹配
pattern = r'<VERB>*<ADV>*<VERB>+<PART>*'
verb_pattern = [{"POS": "VERB", "OP": "*"},{"POS": "ADV", "OP": "*"},{"POS":
"VERB", "OP": "+"},{"POS": "PART", "OP": "*"}]
t_list_1 = textacy.extract.pos_regex_matches(text, pattern)
t_list_2 = textacy.extract.matches(text, verb_pattern)
# take the longest when overlapping
for i, el_i in enumerate(t_list_2):
for j in range(i):
el_j = t_list_2[j]
if not el_j:
continue
if el_j.start <= el_i.start and el_j.end >= el_i.end:
# el_i inside el_j
t_list_2[i] = None
break
elif el_i.start <= el_j.start and el_i.end >= el_j.end:
# el_j inside el_i
t_list_2[j] = None
elif el_i.end > el_j.start and el_i.start < el_j.end:
raise ValueError('partial overlap?')
t_list_2 = [el for el in t_list_2 if el]
pattern=r'**'
动词形式=[{“POS”:“动词”,“OP”:“*”},{“POS”:“ADV”,“OP”:“*”},{“POS”:
“动词”,“OP”:“+”},{“POS”:“部分”,“OP”:“*”}]
t_list_1=textacy.extract.pos_regex_匹配(文本,模式)
t_list_2=textacy.extract.matches(文本、动词模式)
#重叠时取最长时间
对于i,枚举中的el_i(t_列表_2):
对于范围(i)中的j:
el_j=t_列表_2[j]
如果不是el_j:
持续
如果el_j.start=el_i.end:
#el_i内el_j
t_list_2[i]=无
打破
elif el_i.start=el_j.end:
#el_j内el_i
t_列表_2[j]=无
elif el_i.end>el_j.start和el_i.start
我也有同样的问题。一个快速的解决方案可能是spacy实用程序中的过滤器span
具体来说,我在下面发布了一个尝试修复您的示例的帖子
from spacy.util import filter_spans
t_list_2 = filter_spans(t_list_2)
我希望它能帮助你
from spacy.util import filter_spans
t_list_2 = filter_spans(t_list_2)