2

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

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

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

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

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

4

1 回答 1

7

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"

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

[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]

假设每个单词都是一个二进制标签,那么输出应该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"],
        },
    ),

每个训练数据由

  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')
    ]

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

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

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

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

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

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

于 2020-02-10T17:25:55.160 回答