用Spacy处理语法错误

时间:2019-06-04 21:44:30

标签: python nlp spacy

我正在寻找有关构建Personal Assistant的帮助和技巧。

我的项目有多个管道,一个管道使用python的SpeechRecongizer并将其发送到一个新管道,该管道对生成的文本进行解析,以分析所要求的操作及其影响。

问题是有时候我可以从用户那里得到以下句子:

“将音量设置为86%”

问题在于,当我使用en_core_web_sm时,我得到“ Set”不是动词而是形容词,但是如果我给它加上“将 the 的音量设置为86%”的句子,则它被识别为动词。 这种奇怪的行为弄乱了我的助手-您有如何处理该问题的提示吗?

2 个答案:

答案 0 :(得分:1)

我会尽力回答您的每个问题,但请记住,其中一些问题总体上还没有真正得到回答。

  1. Spacy模型不是100%。我在使用巴西葡萄牙语的POS标签时遇到了几个问题,看来您在英语方面也遇到了问题。建议您不要在其他来源中进行POS标记,而不要绕过手写模式。一个很好的模型是:lindat.mff.cuni.cz/services/udpipe-它适用于多种语言,并且有适用于Python的二进制文件。另外,还有一个REST API可用

  2. 这涉及SRL标记。 SRL代表语义角色标签,应该处理诸如“代理”,“动作”,“患者”之类的事情。这是基于模型的活动。今天,这仍然是一个悬而未决的问题。在某些情况下,您可以获得70%的准确度,但这通常是受域限制的,您可能必须自己对模型进行一些调整。

  3. 这也是一个未解决的问题。它与问题解答有关,几乎没有“插入此软件”解决方案。您可以在计算机语言学家协会中了解更多有关它的最新信息以及最新的解决方案:https://aclweb.org/aclwiki/Question_Answering_(State_of_the_art)

答案 1 :(得分:1)

这句话在 spacy 2.3.x / en-core-web-sm / nd / lg:['VBN', 'NN', 'IN', 'CD', 'NN']中解析得很好。

代码(请注意,我们使用后缀'_sm'/'md'/'lg'表示型号):

import spacy

sy_sm = spacy.load('en_core_web_sm')
sy_md = spacy.load('en_core_web_md')
sy_lg = spacy.load('en_core_web_lg')

>>> [k.tag_ for k in sy_sm("Set volume to 86%")]
['VBN', 'NN', 'IN', 'CD', 'NN']
>>> [k.tag_ for k in sy_md("Set volume to 86%")]
['VBN', 'NN', 'IN', 'CD', 'NN']
>>> [k.tag_ for k in sy_lg("Set volume to 86%")]
['VBN', 'NN', 'IN', 'CD', 'NN']

这是对该模型的更难的压力测试,请注意sm,lg模型与md不同;每个都有点错误:

>>> [k.tag_ for k in sy_sm("Set the set of sets to a set result.")]
['VB', 'DT', 'NN', 'IN', 'NNS', 'IN', 'DT', 'VBN', 'NN', '.']
  ^^ - okay                                  ^^^ - I think this should be ADJ, it's not really a past participle
>>> [k.tag_ for k in sy_md("Set the set of sets to a set result.")]
['VBN', 'DT', 'NN', 'IN', 'NNS', 'IN', 'DT', 'JJ', 'NN', '.']
  ^^^ - not past tense                        ^^ correct
>>> [k.tag_ for k in sy_lg("Set the set of sets to a set result.")]
['VB', 'DT', 'NN', 'IN', 'NNS', 'IN', 'DT', 'NN', 'NN', '.']
  ^^ - okay                                  ^^ - should be ADJ