如何使用spacy或nltk检索句子的主要意图? [英] How to retrieve the main intent of a sentence using spacy or nltk?
问题描述
我有一个要使用Spacy或nltk或任何NLP库提取句子的主要有意义部分的用例。
例句1:"我怎样才能高声反对骚扰" 意图是:"大声反对骚扰"
例句2:"唐老鸭是由哪个漫画家/哪个人/谁创作的?" 意图为:"唐老鸭创建者"
例句3:"如何使用spacy或nltk检索句子的主要意图"? 意图:"使用空格nltk检索句子的主要意图"
我是依赖项解析的新手,不知道如何做这件事。请帮帮我。
推荐答案
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"
似乎您所有的输出标记/单词都只是从您的输入中引用的,在这种情况下,如果您只是将您的问题视为一个"span/equence注解"任务,即
[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
。
现在假设这是一个简单的二进制序列标记任务,可以简单地做:
- https://www.google.com/search?q=sequence+labeling+pytorch
- https://www.google.com/search?q=sequence+labeling+tensorflow
但后退一点
- 意图始终是输入的一部分是否真的如此?
- 什么是意图?它是如何定义的?
- 如果意图不在输入中,会发生什么?
好吧,即使我们不谈"意图",只是想提取主要意思,
- 这句话到底是什么意思,是不是只是提取了"重要的词"?如果是这样的话,是什么让这个词变得"重要"?如何定义"重要"?
- 只有不停的词不重要吗?如果是这样的话,您可以简单地删除停用词,例如Stopword removal with NLTK。还有,什么是停顿?
但我听到人们使用依赖项分析
什么是依赖项分析?
- https://web.stanford.edu/~jurafsky/slp3/15.pdf
- http://nlpprogress.com/english/dependency_parsing.html
- https://paperswithcode.com/task/dependency-parsing
证明:CTR+F位于https://web.stanford.edu/~jurafsky/slp3/15.pdf
因此,除非在您的场景中更好地定义了"意图"的概念,否则我不认为简单地使用依赖关系树解析文本会有帮助。
这个训练模型以确定意图的Spacy工具怎么样?
发件人https://github.com/explosion/spaCy/blob/master/examples/training/train_intent_parser.py
是的,这是一个组合使用解析标签和序列标签并将其定义为"Intent"的示例,更具体地说,我们看到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"],
},
),
每个训练数据由
- 文本
- 依赖项头部索引
- 依赖项头部相关的Intent标签
和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
是PLACE
到find
中的('hotel', 'PLACE', 'find')
。
注意:这只是"语义"或"意图"的简单概念,这不是错误的,但定义得很好,因此执行此任务的模型可以在有监督的机器学习范例中进行训练。详情,请参阅https://spacy.io/usage/examples
根据您定义为意图/语义的方式和内容,输入/输出将发生变化,要训练的模型可能会有所不同。
但你为什么要把它弄得这么复杂,我只想要意图字符串?!
因为如果它只是一个字符串,那么"主要含义"或"意图"意味着什么?
我们回到了缺乏定义的问题,这使得这项任务成为一项神奇的任务,而不是计算机可以完成的任务。
这篇关于如何使用spacy或nltk检索句子的主要意图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!