Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Textacy pos_regex_匹配与匹配_Python_Spacy_Textacy - Fatal编程技术网

Python Textacy 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”:“*”}]

我正试图用python在一个句子中找到一个用于NLP问题的动词。我在stackoverflow上找到了一个旧答案,它适用于不推荐的pos_regex_匹配。使用新的matches函数,我遇到了一个相当无聊的问题。新函数返回任何匹配,而不仅仅是最长的匹配(pos_regex_匹配)

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)