【问题标题】:python spacy looking for two (or more) words in a windowpython spacy 在窗口中寻找两个(或更多)单词
【发布时间】:2019-07-01 14:26:05
【问题描述】:

我正在尝试识别文本中的概念。通常我认为当两个或多个单词彼此相对接近时,一个概念就会出现在文本中。 例如,一个概念可以是任何单词 森林树木自然 距离不到 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 worldhello, world(或上述示例的 树触发

我正在寻找一种解决方案,可以在 5 个单词的窗口内生成单词 HelloWorld 的匹配项。

我查看了: https://spacy.io/usage/rule-based-matching

以及那里描述的运算符,但我无法将这种单词窗口方法放在“spacy”语法中。

此外,我也无法将其推广到更多单词。

一些想法? 谢谢

【问题讨论】:

    标签: python nlp spacy matcher


    【解决方案1】:

    对于具有 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
    

    如果你还想匹配另一个顺序(世界???你好),你需要将第二个对称模式添加到你的匹配器中。

    【讨论】:

      【解决方案2】:

      我对 spaCy 比较陌生,但我认为以下模式应该适用于 'hello' 和 'world' 之间由 ASCII 字符组成的任意数量的标记:

      [{"LOWER": "hello"}, {'IS_ASCII': True, 'OP': '*'}, {"LOWER": "world"}]
      

      我使用 Explosion 的 rule-based match explorer 对其进行了测试,它可以正常工作。重叠的匹配将只返回一个匹配(例如,“你好,我的意思是你好世界”)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-29
        • 2022-08-17
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多