gpt4 book ai didi

nlp - 如何在文本中搜索(可分离的)短语

转载 作者:行者123 更新时间:2023-12-03 23:59:07 25 4
gpt4 key购买 nike

我正在寻找一种在文本中搜索短语或惯用表达的方法,无论时态或可能的介词/副词如何,例如如果我正在寻找

call off
我还想找到
My boss called the meeting off.
之类的用法

这可能吗(使用 spacy)?如果是这样,我在寻找 NLP 的什么特性或能力?

最佳答案

是的,你可以用 spacy 来做到这一点:你需要一个依赖解析器来检测单词之间的关系,并使用 lemmatizer 来找到这些单词的正常形式。 spacy 两者都有。

依赖解析器显示词对之间的句法关系,如下所示:

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)

enter image description here

惯用表达倾向于由此类句法树的紧凑子树表示,其特征在于它们之间的特定关系。在不同的句子中,作为成语一部分的单词的确切形式和位置可能会有所不同,但它们之间的关系保持不变。

当我们搜索一个表达式时,我们实际上可以遍历文档中的所有单词,寻找一个具有范式“call”的词,该词具有一个连接的(“子”)词,该词具有依赖关系“prt”和范式“关闭”:

def detect_collocations(doc, parent_lemma, dep, child_lemma):
""" Create a generator of all occurences of collocation in a document.
The elements of generator are all pairs of tokens with lemmas `parent_lemma` and `child_lemma`
and dependency of type `dep` between them that are found in a spacy document `doc`.
"""
for token in doc:
if token.lemma_ == parent_lemma:
for child in token.children:
if child.dep_ == dep and child.lemma_ == child_lemma:
yield token, child

result = list(detect_collocations(doc, 'call', 'prt', 'off'))
print(result)
# [(called, 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_ .

这里是 colab notebook你可以一起玩。

关于nlp - 如何在文本中搜索(可分离的)短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com