1

我正在尝试用 python 在一个句子中查找动词来解决 NLP 问题。我在 stackoverflow 上找到了一个旧答案,它适用于已弃用的 pos_regex_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)

如您所见,模式是相同的,但匹配函数的模式是新格式。例如,旧的 pos_regex_matches 返回,was celebrating而新的匹配同时返回wasand was celebrating。有人遇到过同样的问题吗?是模式问题还是文本问题?

提前致谢

4

2 回答 2

2

我有同样的问题。一个快速的解决方案可能是filter_spans来自 spacy 实用程序。

具体来说,我在下面发布尝试修复您的示例。

from spacy.util import filter_spans

t_list_2 = filter_spans(t_list_2)

我希望它会帮助你。

于 2020-05-29T12:29:36.310 回答
0

我也有同样的问题。虽然我无法找到一个标志来启用表达式的贪婪匹配以返回最长的匹配项而不是子部分,但我已经编写了一小段代码来手动删除不是最大的匹配项。

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]
于 2020-04-01T13:03:17.367 回答