(编辑:我的旧回答更多地是关于一般分类器而不是PatternAnalyzer)
TextBlob在您的代码中使用“PatternAnalyzer”。它的行为在该文档中简要说明:http://www.clips.ua.ac.be/pages/pattern-en#parser
我们可以看到:
pattern.en模块捆绑了形容词词汇表(例如,好、坏、惊人、刺激人的...),这些形容词经常出现在产品评论中,带有情感极性(正向↔负向)和主观性(客观↔主观)的分数注释。
sentiment()函数返回给定句子的(极性、主观性)元组,基于它包含的形容词,
以下是一个示例,展示了算法的行为。极性直接取决于所使用的形容词。
sentiment_analyzer.analyze('player')
Sentiment(polarity=0.0, subjectivity=0.0)
sentiment_analyzer.analyze('bad player')
Sentiment(polarity=-0.6999998, subjectivity=0.66666)
sentiment_analyzer.analyze('worst player')
Sentiment(polarity=-1.0, subjectivity=1.0)
sentiment_analyzer.analyze('best player')
Sentiment(polarity=1.0, subjectivity=0.3)
专业软件通常使用基于神经网络和分类器的复杂工具,结合词法分析。但对于我来说,TextBlob仅尝试根据语法分析的直接结果(此处是形容词的极性)给出结果。这是问题的根源。
它不会尝试检查一般句子是否是否定的(带有“不”单词)。它会尝试检查形容词是否是否定的(因为它仅适用于形容词,而不适用于一般结构)。在这里,“best”被用作名词,不是否定的形容词。因此,极性是积极的。
sentiment_analyzer.analyze('not the best')
Sentiment(polarity=1.0, subjectivity=0.3)
只需更改单词的顺序即可对形容词进行否定,而不是整个句子。
sentiment_analyzer.analyze('the not best')
Sentiment(polarity=-0.5, subjectivity=0.3)
这里,形容词被否定了。因此,极性是负面的。
这是我对那种“奇怪行为”的解释。
真正的实现定义在文件中:
https://github.com/sloria/TextBlob/blob/dev/textblob/_text.py
有趣的部分如下:
if w in self and pos in self[w]:
p, s, i = self[w][pos]
if m is None:
a.append(dict(w=[w], p=p, s=s, i=i, n=1, x=self.labeler.get(w)))
...
else:
if negation and w in self.negations:
n = w
elif n and len(w.strip("'")) > 1:
n = None
if n is not None and m is not None and (pos in self.modifiers or self.modifier(m[0])):
a[-1]["w"].append(n)
a[-1]["n"] = -1
n = None
elif m and len(w) > 2:
m = None
if w == "!" and len(a) > 0:
...
如果我们输入“not a good”或“not the good”,它将匹配else部分,因为它不是一个单一的形容词。
“not a good”部分将匹配
elif n and len(w.strip("'")) > 1:
,所以它将反转极性。"not the good"不会匹配任何模式,所以极性将与“best”相同。
整个代码是一系列微调、语法指示(例如添加!增加极性,添加笑脸表示讽刺等)。这就是为什么有些特定的模式会给出奇怪的结果。要处理每个特定情况,您必须检查您的句子是否与代码的那部分中的任何if语句匹配。
我希望我能帮到你。