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 NaiveBayesAnalyzer 极慢(与 Pattern 相比)
用 nltk 训练我自己的分类器后,如何将它加载到 textblob 中?