我正努力在一个句子中提取主语,这样我就可以得到与主语一致的情感。为此,我在python2.7中使用nltk
。以下面这句话为例:
Donald Trump is the worst president of USA, but Hillary is better than him
我们可以看到Donald Trump
和Hillary
是两个主题,与Donald Trump
相关的情绪是阴性的,但与Hillary
相关的情绪是阳性的。到目前为止,我能把这个句子分成几组名词短语,并且我能得到以下结果:
(S
(NP Donald/NNP Trump/NNP)
is/VBZ
(NP the/DT worst/JJS president/NN)
in/IN
(NP USA,/NNP)
but/CC
(NP Hillary/NNP)
is/VBZ
better/JJR
than/IN
(NP him/PRP))
现在,我该如何从这些名词短语中找出主语呢?那么我该如何将两个主题的短语组合在一起呢?一旦我有了分别针对两个受试者的短语,我就可以分别对两个受试者进行情绪分析。
编辑
我查看了@Krzysiek(spacy
)提到的库,它在语句中还给了我依赖树。
代码如下:
from spacy.en import English
parser = English()
example = u"Donald Trump is the worst president of USA, but Hillary is better than him"
parsedEx = parser(example)
# shown as: original token, dependency tag, head word, left dependents, right dependents
for token in parsedEx:
print(token.orth_, token.dep_, token.head.orth_, [t.orth_ for t in token.lefts], [t.orth_ for t in token.rights])
下面是依赖树:
(u'Donald', u'compound', u'Trump', [], [])
(u'Trump', u'nsubj', u'is', [u'Donald'], [])
(u'is', u'ROOT', u'is', [u'Trump'], [u'president', u',', u'but', u'is'])
(u'the', u'det', u'president', [], [])
(u'worst', u'amod', u'president', [], [])
(u'president', u'attr', u'is', [u'the', u'worst'], [u'of'])
(u'of', u'prep', u'president', [], [u'USA'])
(u'USA', u'pobj', u'of', [], [])
(u',', u'punct', u'is', [], [])
(u'but', u'cc', u'is', [], [])
(u'Hillary', u'nsubj', u'is', [], [])
(u'is', u'conj', u'is', [u'Hillary'], [u'better'])
(u'better', u'acomp', u'is', [], [u'than'])
(u'than', u'prep', u'better', [], [u'him'])
(u'him', u'pobj', u'than', [], [])
这就深入了解了句子中不同标记的依赖关系。这是本文的link,它描述了不同对之间的依赖关系。如何使用此树将不同主题的上下文单词附加到它们上?
我最近刚解决了一个非常相似的问题-我需要提取主题,动作,对象。我公开了我的作品,这样你就可以查看这个图书馆: https://github.com/krzysiekfonal/textpipeliner
这是基于spacy(nltk的对手)但也基于句子树。
例如,让我们将这个doc嵌入到spacy中作为示例:
现在可以创建一个简单的管道结构(有关此项目自述文件中的管道的详细信息):
结果是:
实际上,它强烈地基于另一个库grammaregex(查找管道)。你可以从一篇文章中读到: https://medium.com/@krzysiek89dev/grammaregex-library-regex-like-for-text-mining-49e5706c9c6d#.zgx7odhsc
已编辑
实际上,我在自述文件中给出的示例抛弃了adj,但您只需要根据需要调整传递到引擎的管道结构。 例如,对于你的例句,我可以提出这样的结构/解决方案,每句话有三个元素(subj,verb,adj)组成的元组:
它会给你结果:
有一点复杂,事实上你有一个复合语句,而lib每句产生一个元组-我很快会添加一种可能性(我的项目也需要它)来将管道结构列表传递给引擎,以允许每句产生更多元组。但现在,您可以通过为复合句创建第二个引擎来解决这个问题,该引擎的结构只与动词/conj/动词不同,而不是动词(这些regex总是从根开始,所以动词/conj/动词只会引导您找到复合句中的第二个动词):
现在,在运行两个引擎之后,您将得到预期的结果:)
我想这就是你需要的。当然,我只是很快为给定的示例语句创建了一个管道结构,它不会适用于所有的情况,但是我看到了很多语句结构,它已经实现了很好的百分比,但是接下来您可以为当前不起作用的情况添加更多FindTokensPipe等,我相信经过一些调整后,您会覆盖得非常好可能的句子数(英语不太复杂,所以…:)
我更仔细地研究了spacy库,最后通过依赖关系管理找到了解决方案。多亏了thisrepo,我找到了如何在我的主观性动词宾语中包括形容词(使其成为SVAO的宾语),以及在查询中去掉复合主语。我的解决方案是:
现在,当您传递查询时,例如:
您将得到以下信息:
感谢@Krzysiek为您提供的解决方案,实际上我无法深入到您的库中修改它。我宁愿修改上面提到的链接来解决我的问题。
相关问题 更多 >
编程相关推荐