我正在尝试用python在句子中寻找动词来解决NLP问题。我在stackoverflow上找到了一个旧的答案,它适用于不推荐使用的pos_regex_matches。使用新的matches函数时,我遇到了一个非常无聊的问题。新函数返回任何匹配,而不仅仅是最长的匹配(这是pos_regex_matches所做的)。
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)正如您所看到的,模式是相同的,但是matches函数的模式是新的格式。例如,旧的pos_regex_matches返回was celebrating,而新的匹配同时返回was和was celebrating。是否有人遇到过同样的问题?是模式问题还是文本问题?
提前感谢
发布于 2020-05-29 20:29:36
我也遇到过同样的问题。一个快速的解决方案可能是spacy实用程序的filter_spans。
具体地说,我在下面发布了一个尝试修复你的例子。
from spacy.util import filter_spans
t_list_2 = filter_spans(t_list_2)我希望它能对你有所帮助。
发布于 2020-04-01 21:03:17
我也有同样的问题。虽然我还没有找到一个标志来启用表达式的贪婪匹配,以返回最长的匹配项,而不是子部分,但我已经编写了这段代码来手动删除非最大匹配项。
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]https://stackoverflow.com/questions/60153410
复制相似问题