【问题标题】:How to split sentences into correlated words (term extraction)?如何将句子拆分成相关的词(词条提取)?
【发布时间】:2018-08-01 11:21:43
【问题描述】:

是否有任何 NLP python 库可以拆分句子或将单词连接成相关的单词对?例如:

that is not bad example -> "That" "is" "not bad" "example"

“不错”与“好”的含义相同,因此在机器学习中将其处理为“不”和“坏”是没有用的。 我什至不知道如何称呼这些相关的词对。 (术语提取?阶段提取?) 或者用名词拆分成形容词会更好,例如:

关于减税的不诚实媒体 -> “不诚实媒体”、“相关”、“关于”、“减税”

我找到了topia.termextract,但它不适用于python3。

【问题讨论】:

  • nltk.org/book/ch07.html 第 2.1 部分
  • 结帐 spacy。 spacy.io/usage/linguistic-features#section-tokenization我不知道为什么人们投票反对。
  • 它在文档中的哪里说如何做到这一点?我看不到它
  • 参见“基于规则的匹配”中关于PhraseMatcher() 的部分。它是一个高度可定制的框架,允许使用引理规则、正则表达式等。但不是开箱即用的解决方案。反正。干杯
  • “不错”与“好”不一样……实际上它不如好,但高于坏。

标签: python nlp nltk sentiment-analysis text-extraction


【解决方案1】:

结帐Spacy library(见链接)。

它没有开箱即用的功能,因为您需要构建规则,但规则非常易于阅读,并且您可以输入许多选项(POS 标签、正则表达式、引理或任何这些的组合等)

特别值得注意的是PhraseMarker()class上的部分。

直接从文档中复制的是代码示例:

import spacy
from spacy.matcher 
import PhraseMatcher

nlp = spacy.load('en')
matcher = PhraseMatcher(nlp.vocab)
terminology_list = ['Barack Obama', 'Angela Merkel', 'Washington, D.C.']
patterns = [nlp(text) for text in terminology_list]
matcher.add('TerminologyList', None, *patterns)

doc = nlp(u"German Chancellor Angela Merkel and US President Barack Obama "
          u"converse in the Oval Office inside the White House in Washington, D.C.")
matches = matcher(doc)

【讨论】:

  • 如果它只是一个已知地名词典的列表,NLTK 也会这样做stackoverflow.com/a/47664608/610569 =)
  • 完全。但是定制和易用性给我留下了相当深刻的印象。我都用过,但是 Spacy 有一些其他的功能让我开始使用它(在这个问题的范围之外)。
  • 这不是我想要的。我想匹配任何名词,而不仅仅是预定义的。
  • 阅读文档的其余部分。它确实允许您根据 POS 和单词依赖关系自动配对单词。
  • 具体来说,Spacy 说The rule matcher (class) also lets you pass in a custom callback to act on matches – for example, to merge entities and apply custom labels. 这些自定义标签将是您的新标记化方案。您还可以利用文档的依赖项解析部分。 (spacy.io/usage/linguistic-features#section-dependency-parse)。工具都在那里,但您不会找到满足您要求的即插即用解决方案;您是否希望将“减税”和/或“不诚实的媒体”归为一组,很大程度上取决于用例。
【解决方案2】:

要自动检测句子流中的常用短语,我建议您查看Gensim Phrase (collocation) detection

如何工作的好例子:

bigram = 短语(短语)

sent = [u'the', u'mayor', u'of', u'new', u'york', u'was', u'there']

打印(二元组[发送])

输出:[u'the', u'mayor', u'of', u'new_york', u'was', u'there']

【讨论】:

  • OP 想要配对的不是名词块(gensim 做得很好),而是紧密联系在一起的单词的依赖解析。在 NLTK 和其他一些标记化库中都有方法可以做到这一点,但是OP 似乎想要一些开箱即用的东西
【解决方案3】:

这取决于您使用的机器学习模型及其训练方式。 标准是 nltk 或 textblob

我认为 textblob 应该已经针对这些语言问题进行了培训:

import re
x = ' '.join(re.sub('(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)', ' ', 'That is not bad example').split())

from textblob import TextBlob
analysis = TextBlob(x)
sentiment = analysis.sentiment.polarity

上面的代码应该产生以下观点:

'That is bad example' : -0.6999999999999998    
'That is not bad example' : 0.3499999999999999
'That is good example' : 0.7
'That is not good example' : -0.35

您已经可以看到,这个情绪分析器已经掌握了一些双重否定和否定肯定的概念。它可以通过调用进一步训练:

from textblob.classifiers import NaiveBayesClassifier
cl = NaiveBayesClassifier(training_Set) 

并使用cl,但最好通过一些任意阈值(如果 > 0.1 则很好)来定义什么是积极情绪。我的意思是“坏”和“不好”已经是负面的......那为什么要重新发明轮子呢?

现在的 ML 已经“足够聪明”了...您经常需要使用自己的智能来弥补机器缺乏的差距...

您也可以使用sentiment = analysis.sentiment.subjectivity 来查看文本的客观或主观程度,从而为您提供更多见解

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多