python - python spacy 在窗口中寻找两个(或更多)单词
问题描述
我正在尝试识别文本中的概念。通常我认为当两个或多个单词彼此相对接近时,一个概念就会出现在文本中。例如,一个概念可以是 距离火灾、烧伤、过热 不到4个词的 任何词森林、树木、自然。
我正在学习 spacy,到目前为止,我可以像这样使用匹配器:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, [{"LOWER": "hello"}, {"IS_PUNCT": True}, {"LOWER": "world"}],[{"LOWER": "hello"}, {"LOWER": "world"}])
这将匹配hello world和hello, world(或上述示例的树触发)
我正在寻找一种解决方案,可以在 5 个单词的窗口内产生单词Hello和World的匹配。
我看了看: https ://spacy.io/usage/rule-based-matching
以及那里描述的运算符,但我无法将这种单词窗口方法放在“spacy”语法中。
此外,我也无法将其推广到更多单词。
一些想法?谢谢
解决方案
对于具有 K 个单词的窗口,其中 K 相对较小,您可以在单词之间添加 K-2 个可选通配符标记。通配符表示“任何符号”,在 Spacy 术语中它只是一个空字典。可选意味着令牌可能存在也可能不存在,并且在 Spacy 中被编码为{"OP": "?"}
.
因此,您可以将匹配器编写为
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", None, [{"LOWER": "hello"}, {"OP": "?"}, {"OP": "?"}, {"OP": "?"}, {"LOWER": "world"}])
这意味着您要查找“hello”,然后查找 0 到 3 个任何类型的标记,然后查找“world”。例如,对于
doc = nlp(u"Hello brave new world")
for match_id, start, end in matcher(doc):
string_id = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match_id, string_id, start, end, span.text)
它会打印你
15578876784678163569 HelloWorld 0 4 Hello brave new world
如果你还想匹配另一个顺序(world ? ? ? hello),你需要将第二个对称模式添加到你的匹配器中。
推荐阅读
- open-policy-agent - 如何根据开放策略代理 (OPA) 中的 OR 标准返回响应对象。获取错误完整规则一定不能产生多个输出?
- typo3 - 如何组合验证多个 Typo3 动作参数?
- r - 对于 R 包,如何有效地将包从 Depends 移动到 Imports
- python - 试图让 Numpy for python 在 vscode 上工作
- javascript - ajax请求后更新前面的函数
- node.js - 节点在 X 时间后发送文本?
- excel - 使用 Excel 公式查找特定字符并返回单元格中的下一个值
- python - 我的数据帧不会附加这个 iloc 数据帧
- python - 保存到表第一次但不是第二次会导致错误:SQLalchemy 中的 NOT NULL 约束失败
- vhdl - 制作单输入解复用器