如何使用 spacy 或 nltk 检索句子的主要意图?

Sub*_*ick 2 nlp nltk pos-tagger spacy dependency-parsing

我有一个用例,我想使用 spacy 或 nltk 或任何 NLP 库提取句子的主要有意义的部分。

例句1: “我如何提高反对骚扰的声音” 意图是: “提高反对骚扰的声音”

例句2: “唐老鸭是由哪个漫画家/哪个男人/谁创作的?” 意图是: “唐老鸭是由”创造的

例句3: “如何使用spacy或nltk检索句子的主要意图”? 意图: “使用 spacy nltk 检索句子的主要意图”

我是依赖解析的新手,并不完全知道如何做到这一点。请帮我。

alv*_*vas 5

TL; 博士

您必须定义要执行的最终任务,并定义“意图”/“主要信息”或“文本含义”究竟是什么。

在龙

乍一看,您似乎是在要求神奇地解决自然语言问题。但是让我们看看这个问题和你真正要问的问题,让我们避免所有意图/标签或语言的概念(一段时间),看看输入/输出是什么:

[in]:  "How Can I raise my voice against harassment"
[out]: "raise voice against harassment"

[in]:  "Donald Duck is created by which cartoonist/which man/whom ?" 
[out]: "Donald duck is created by"

[in]:  "How to retrieve the main intent of a sentence using spacy or nltk ?" 
[out]: "retrieve main intent of sentence using spacy nltk"
Run Code Online (Sandbox Code Playgroud)

似乎您所有的输出标记/单词都只是您输入的引用,在这种情况下,如果您只是将您的问题视为“跨度/序列注释”任务,即

[in]:  "How Can I raise my voice against harassment"
[out]: [0, 0, 0, 1, 0, 1, 1, 1] 

[in]:  "Donald Duck is created by which cartoonist/which man/whom ?" 
[out]: [1, 1, 1, 1, 0, 0, 0]

[in]:  "How to retrieve the main intent of a sentence using spacy or nltk ?" 
[out]: [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

假设每个单词都是一个二元标签,输出应该标记1你想从输入中提取的单词和你不想提取的单词0

现在考虑到它是一个简单的二进制序列标记任务,可以简单地执行以下操作:

但退后一点,

  • 意图始终是输入的一部分真的是真的吗?
  • 究竟什么是意图?它是如何定义的?
  • 如果意图不在输入中会发生什么?

好吧,即使我们不谈“意图”,只想提取主要含义,

  • 这句话的意思到底是什么,只是提取“重要词”吗?如果是这样,是什么使词语“重要”?如何定义“重要”?
  • 只有不停的词不重要吗?如果是这样,那么您可以简单地删除停用词,例如使用 NLTK删除停用词。还有,什么是停用词?

但我听说有人用依赖解析来做这件事

什么是依赖解析?

简而言之,它提供了文本的结构化表示。但是传统依赖形式主义中的结构没有“意图”的概念。

证明:https : //web.stanford.edu/~jurafsky/slp3/15.pdf 上的 CTR + F

所以我不认为仅仅用依赖树解析文本会有帮助,除非在你的场景中更好地定义了“意图”的概念。

这个用于训练意图模型的 SpaCy 工具怎么样?

来自https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py

是的,这是使用组合解析标签和序列标签并将其定义为“意图”的示例,更具体地说,我们从https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser看到示例.py#L31

TRAIN_DATA = [
    (
        "find a cafe with great wifi",
        {
            "heads": [0, 2, 0, 5, 5, 2],  # index of token head
            "deps": ["ROOT", "-", "PLACE", "-", "QUALITY", "ATTRIBUTE"],
        },
    ),
    (
        "find a hotel near the beach",
        {
            "heads": [0, 2, 0, 5, 5, 2],
            "deps": ["ROOT", "-", "PLACE", "QUALITY", "-", "ATTRIBUTE"],
        },
    ),
Run Code Online (Sandbox Code Playgroud)

每个训练数据由

  1. 文本
  2. 依赖头的索引
  3. 与依赖项相关的“意图”标签

以及来自https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py#L173 的/输出示例

[in]:  find a hotel with good wifi
[out]:
    [
      ('find', 'ROOT', 'find'),
      ('hotel', 'PLACE', 'find'),
      ('good', 'QUALITY', 'wifi'),
      ('wifi', 'ATTRIBUTE', 'hotel')
    ]
Run Code Online (Sandbox Code Playgroud)

上面的例子表明,整个三元组列表被定义为一个意图,而不仅仅是原始字符串。三胞胎是指(dependent, relation, head),例如将hotelPLACEfind从三胞胎('hotel', 'PLACE', 'find')

注意:这仅仅是“语义”或“意图”的 SpaCy 概念,它没有错误但定义明确,因此执行此任务的模型可以在有监督的机器学习范式中进行训练。详情见 https://spacy.io/usage/examples

根据您定义为意图/语义的方式和内容,输入/输出会发生变化,并且要训练的模型可能会有所不同。

但是你为什么要弄得这么复杂,我只想要意图字符串?!

因为如果它只是一个字符串,那么“主要含义”或“意图”是什么意思?

我们回到定义的缺乏,这使得任务成为一项神奇的任务,而不是计算机可以执行的任务。

  • 对相当复杂的主题的非常好的(简短的)描述。对于句子的最小“意图”,您可以使用主谓宾模型探索依存解析。它快速而肮脏,但在类似文档的语料库上运行得相当好(很大程度上取决于您的文档代表的语言类型)。 (2认同)