TextBlob NaiveBayesAnalyzer 极慢(与 Pattern 相比)

Posted

技术标签:

【中文标题】TextBlob NaiveBayesAnalyzer 极慢(与 Pattern 相比)【英文标题】:TextBlob NaiveBayesAnalyzer extremely slow (compared to Pattern) 【发布时间】:2016-01-19 10:03:22 【问题描述】:

我正在使用 TextBlob for python 对推文进行一些情绪分析。 TextBlob 中的默认分析器是 PatternAnalyzer,它运行良好且速度非常快。

sent = TextBlob(tweet.decode('utf-8')).sentiment

我现在尝试切换到 NaiveBayesAnalyzer,但发现运行时无法满足我的需求。 (每条推文接近 5 秒。)

sent = TextBlob(tweet.decode('utf-8'), analyzer=NaiveBayesAnalyzer()).sentiment

我之前使用过朴素贝叶斯分类器的 scikit learn 实现,并没有发现它这么慢,所以我想知道在这种情况下我是否正确使用它。

我假设分析器是预训练的,至少 the documentation 声明“在电影评论数据集上训练的朴素贝叶斯分析器”。但它也有一个函数 train(),被描述为“在电影评论语料库上训练朴素贝叶斯分类器”。它是否在每次运行之前在内部训练分析器?我希望不会。

有人知道加快速度的方法吗?

【问题讨论】:

【参考方案1】:

如果您在数据框中有表数据并且想要使用 textblob 的 NaiveBayesAnalyzer,那么添加到 Alan 的非常有用的答案中就可以了。只需将 word_list 更改为您的相关字符串系列即可。

import textblob
import pandas as pd

tb = textblob.Blobber(analyzer=NaiveBayesAnalyzer())
for index, row in df.iterrows():
    sent = tb(row['word_list']).sentiment
    df.loc[index, 'classification'] = sent[0]
    df.loc[index, 'p_pos'] = sent[1]
    df.loc[index, 'p_neg'] = sent[2]

上面将sentiment返回的元组分成三个独立的系列。

如果系列都是字符串,但如果它具有混合数据类型,则此方法有效,这在具有 object 数据类型的 pandas 中可能是一个问题,那么您可能需要在其周围放置一个 try/except 块以捕获异常。

在我的测试中,它准时在 4.7 秒内完成 1000 行。

希望这有帮助。

【讨论】:

【参考方案2】:

是的,Textblob 将在每次运行前训练分析器。您可以使用以下代码来避免每次都训练分析器。

from textblob import Blobber
from textblob.sentiments import NaiveBayesAnalyzer
tb = Blobber(analyzer=NaiveBayesAnalyzer())

print tb("sentence you want to test")

【讨论】:

这太棒了!我的测试文件的运行时间从超过 5 小时缩短到不到 7 秒! @MattM。你觉得哪款分析仪更好?来自 nltk 的模式库或 NaiveBayes? @soham.m17 我没有对它们进行广泛的比较,但我似乎记得(至少出于我的目的)它们的表现相当。 我正在使用 PatternAnalyzer 但它需要很多时间。有什么办法可以加快速度? @Alan,我现在正在用你的代码测试这个确切的东西,它似乎需要一段时间?我预计大概需要多少?

以上是关于TextBlob NaiveBayesAnalyzer 极慢(与 Pattern 相比)的主要内容,如果未能解决你的问题,请参考以下文章

Textblob 逻辑帮助。 NaiveBayes分类器

使用 TextBlob 库的最高极性得分(情绪分析)

TextBlob NaiveBayesAnalyzer 极慢(与 Pattern 相比)

用 nltk 训练我自己的分类器后,如何将它加载到 textblob 中?

在 TextBlob 中使用翻译功能时出现“HTTPError:HTTP 错误 404:未找到”

使用 TextBlob 的朴素贝叶斯文本分类:当添加更多样本量时,每个实例都预测为负数