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

问题描述 投票:-1回答:1

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

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

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

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

我是依赖分析的新手,并不完全知道如何执行此操作。请帮助我。

nlp nltk spacy pos-tagger dependency-parsing
1个回答
0
投票

TL; DR

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

详细

[乍看之下,您似乎要求魔术般解决自然语言问题。但是,让我们看一下问题和您真正要问的是什么,让我们避免使用意图/标签或语言的所有概念(一段时间),而只看输入/输出的内容:

[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标记为不需要的单词。

现在,由于这是一个简单的二进制序列标记任务,因此只需执行以下操作:

但是稍微退后一步,

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

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

  • 句子的确切含义是在提取“重要单词”吗?如果是这样,什么使“重要”一词呢?如何定义“重要”?
  • 只是不停的话不重要吗?如果是这样,那么您可以简单地删除停用词,例如Stopword removal with NLTK。而且,停用词又是什么?

但是我听说有人通过依赖性分析来做到这一点

什么是依赖项解析?

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

证明: CTR + https://web.stanford.edu/~jurafsky/slp3/15.pdf上的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. 依赖项头的索引
  • 与依赖项头有关的“意图”标签
  • 以及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),例如hotel是三元组PLACEfind('hotel', 'PLACE', 'find')

    但是为什么要使其变得如此复杂,我只想要意图字符串?!

    因为意图只是一个字符串,这意味着什么?我们回过头来,缺乏定义使任务变得神奇,而不是计算机可以执行的任务。

    © www.soinside.com 2019 - 2024. All rights reserved.