使用 `testacy.extract.pos_regex_matches(...)` 将 PoS 标签与特定文本匹配

Matching PoS tags with specific text with `testacy.extract.pos_regex_matches(...)`

我正在使用 textacypos_regex_matches 方法来查找句子中的某些文本块。

例如,假设我有文本:Huey, Dewey, and Louie are triplet cartoon characters.,我想检测 Huey, Dewey, and Louie 是一个枚举。

为此,我使用了以下代码(在 testacy 0.3.4,撰写本文时可用的版本):

import textacy

sentence = 'Huey, Dewey, and Louie are triplet cartoon characters.'
pattern = r'<PROPN>+ (<PUNCT|CCONJ> <PUNCT|CCONJ>? <PROPN>+)*'
doc = textacy.Doc(sentence, lang='en')
lists = textacy.extract.pos_regex_matches(doc, pattern)
for list in lists:
    print(list.text)

打印:

Huey, Dewey, and Louie

但是,如果我有类似下面的内容:

sentence = 'Donald Duck - Disney'

然后 -(破折号)被识别为 <PUNCT> 并且整个句子被识别为列表 - 但事实并非如此。

有没有办法指定只有 ,; 对列表有效 <PUNCT>

我一直在寻找有关这种用于匹配 PoS 标签的正则表达式语言的参考资料,但没有成功,有人可以帮忙吗?提前致谢!

PS:我尝试用 <[;,]|CCONJ><;,|CCONJ><[;,]|CCONJ><PUNCT[;,]|CCONJ><;|,|CCONJ> 替换 <PUNCT|CCONJ>和评论中建议的<';'|','|CCONJ>,但没有用...

是短的,不可能的:见this official page.

但是合并请求包含页面中描述的修改版本的代码,因此可以重新创建功能,尽管它的性能不如使用 SpaCyMatcher(参见 code and example -- 尽管我不知道如何使用 Matcher).

重新实现我的问题

如果你想走这条路,你必须换线:

words.extend(map(lambda x: re.sub(r'\W', '', x), keyword_map[w]))

具有以下内容:

words.extend(keyword_map[w])

否则每个符号(如 ,; 在我的例子中)将被剥离。