我正在尝试确定文本中的概念。通常,我认为当两个或多个单词彼此相对接近时,一个概念就会出现在文本中。
例如,一个概念就是任何一个词
森林,树木,自然
距离少于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
而且,如果还要匹配其他顺序(世界???你好),则需要在匹配器中添加第二个对称模式。
关于python - python spacy在窗口中寻找两个(或更多)单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56837440/