Nlp 如何在文本中搜索(可分离)短语

Nlp 如何在文本中搜索(可分离)短语,nlp,spacy,Nlp,Spacy,我正在寻找一种在文本中搜索短语或惯用表达的方法,而不考虑时态或可能的介词/副词,例如,如果我正在寻找取消,我还希望找到类似“我的老板”called the meetingoff的用法 call off My boss called the meeting off. 这是否可能(使用spacy)?如果是这样的话,我在寻找NLP的什么特性或功能?是的,您可以使用spacy来实现:您需要一个依赖项解析器来检测单词之间的关系,并使用lemmatizer来查找这些单词的正常形式。斯帕西两者兼而有之 依赖项

我正在寻找一种在文本中搜索短语或惯用表达的方法,而不考虑时态或可能的介词/副词,例如,如果我正在寻找取消,我还希望找到类似“我的老板”called the meetingoff的用法

call off My boss called the meeting off.
这是否可能(使用spacy)?如果是这样的话,我在寻找NLP的什么特性或功能?

是的,您可以使用spacy来实现:您需要一个依赖项解析器来检测单词之间的关系,并使用lemmatizer来查找这些单词的正常形式。斯帕西两者兼而有之

依赖项分析器显示词对之间的语法关系,如下所示:

import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
doc = nlp('My boss called the meeting off.')
displacy.render(doc, style="dep", jupyter=True)

惯用表达往往由这种句法树的紧凑子树表示,其特点是它们之间的特定关系。在不同的句子中,成语中的单词的确切形式和位置可能不同,但它们之间的关系保持不变

当我们搜索一个表达式时,我们实际上可以遍历文档中的所有单词,查找一个具有正常形式“call”的单词,该单词具有一个连接的(“子”)单词,依赖项为“prt”,正常形式为“off”:

由于上述函数返回成对的
spacy.Token
对象,因此您可以从这些对象中提取元数据,例如它们的位置以在文本中突出显示它们:

positions = {t.idx for pair in result for t in pair}
for token in doc:
    print('_{}_'.format(token) if token.idx in positions else token, end=' ')
# My boss _called_ the meeting _off_ . 

这是一个你可以玩的游戏。

这是@Sofie Vl在代码中的想法

安装spacy的预发布版本及其使用的语言模型:

!pip install spacy-nightly
!python -m spacy download en_core_web_sm
此时,您可能需要重新启动运行时

import spacy
nlp = spacy.load("en_core_web_sm")
from spacy.matcher import DependencyMatcher

matcher = DependencyMatcher(nlp.vocab)
这就是魔法发生的地方<代码>引理匹配,好吧,引理,但还有其他比较,例如“ORTH”与需要完全(正交)匹配等

pattern = [
  {
    "RIGHT_ID": "call",
    "RIGHT_ATTRS": {"LEMMA": "call"}
  },
  {
    "LEFT_ID": "call",
    "REL_OP": ">",
    "RIGHT_ID": "off",
    "RIGHT_ATTRS": {"DEP": "prt", "LEMMA": "off"}
  }
]
注册模式,运行它并显示结果

matcher.add("called off", [pattern])

doc = nlp("There won't be any calling them off.")

result = matcher(doc)

positions = {t for pattern, pair in result for t in pair}
for token in doc:
    print('_{}_'.format(token) if token.i in positions else token, end=' ')
结果如下:

# There wo n't be any _calling_ them _off_ . 

你能想出一个“短语或惯用表达”的正式定义,以及有代表性的正面和负面例子吗?我总是在寻找某个特定短语的用法,如果这是你要问的话,我不希望一般能够识别这些短语。我想这是一个很好的答案!除此之外,我想向您介绍spaCy 3的一个新功能,即依赖项匹配器:spaCy 3尚未正式发布,但您可以使用
pip install spaCy nightly
安装发行候选版本。
# There wo n't be any _calling_ them _off_ .