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

时间:2018-06-13 02:25:13

标签: python nltk naivebayes textblob

textblob中的内置分类器非常愚蠢。它接受过电影评论培训,因此我在我的背景下创建了大量示例(57,000个故事,分类为正面或负面)然后使用nltk.进行训练我尝试使用textblob来训练它但是它总是失败:

with open('train.json', 'r') as fp:
    cl = NaiveBayesClassifier(fp, format="json")

这将持续数小时并以内存错误结束。

我查看了源代码,发现它只是使用了nltk并将其包装起来,所以我使用了它,它起作用了。

nltk训练集的结构需要是一个元组列表,第一部分是文本中的单词计数器和出现频率。元组的第二部分是' pos'或者' neg'感慨。

>>> train_set = [(Counter(i["text"].split()),i["label"]) for i in data[200:]]
>>> test_set = [(Counter(i["text"].split()),i["label"]) for i in data[:200]] # withholding 200 examples for testing later

>>> cl = nltk.NaiveBayesClassifier.train(train_set) # <-- this is the same thing textblob was using

>>> print("Classifier accuracy percent:",(nltk.classify.accuracy(cl, test_set))*100)
('Classifier accuracy percent:', 66.5)
>>>>cl.show_most_informative_features(75)

然后我腌了它。

with open('storybayes.pickle','wb') as f:
    pickle.dump(cl,f)

现在......我拿了这个腌制文件,然后重新打开它以获得nltk.classifier&#39; nltk.classify.naivebayes.NaiveBayesClassifier&#39;&gt; - 并尝试将其提供给textblob。而不是

from textblob.classifiers import NaiveBayesClassifier
blob = TextBlob("I love this library", analyzer=NaiveBayesAnalyzer())

我试过了:

blob = TextBlob("I love this library", analyzer=myclassifier)
Traceback (most recent call last):
  File "<pyshell#116>", line 1, in <module>
    blob = TextBlob("I love this library", analyzer=cl4)
  File "C:\python\lib\site-packages\textblob\blob.py", line 369, in __init__
    parser, classifier)
  File "C:\python\lib\site-packages\textblob\blob.py", line 323, in 
_initialize_models
    BaseSentimentAnalyzer, BaseBlob.analyzer)
  File "C:\python\lib\site-packages\textblob\blob.py", line 305, in 
_validated_param
    .format(name=name, cls=base_class_name))
ValueError: analyzer must be an instance of BaseSentimentAnalyzer
现在怎么样?我查看了源代码,两者都是类,但不完全一样。

3 个答案:

答案 0 :(得分:0)

遍历错误消息,看来分析器必须从抽象类BaseSentimentAnalyzer继承。如文档here中所述,此类必须必须实现analyze(text)函数。但是,在检查NLTK的实现文档时,我在主文档here或其父类ClassifierI here中找不到此方法。因此,我相信,除非您可以在NLTK的实现中实现新的analyze函数以使其与TextBlob兼容,否则不能将这两种实现组合在一起。

答案 1 :(得分:0)

我不确定nltk语料库不能与textblob一起使用,这会让我感到惊讶,因为textblob会在其源代码中导入所有nltk函数,并且基本上是包装器。

但是经过数小时的测试,我得出的结论是nltk提供了一种更好的内置情感语料库,称为"vader",胜过我所有训练有素的模型。

import nltk
nltk.download('vader_lexicon') # do this once: grab the trained model from the web
from nltk.sentiment.vader import SentimentIntensityAnalyzer
Analyzer = SentimentIntensityAnalyzer()
Analyzer.polarity_scores("I find your lack of faith disturbing.")
{'neg': 0.491, 'neu': 0.263, 'pos': 0.246, 'compound': -0.4215}
CONCLUSION: NEGATIVE

vader_lexicon和nltk代码对句子中的否定语言进行了很多分析,以便否定肯定的单词。就像达斯·维达(Darth Vader)所说的“缺乏信仰”将情感转变为相反的情感一样。

我在这里解释了它,并举例说明了更好的结果: https://chewychunks.wordpress.com/2018/06/19/sentiment-analysis-discovering-the-best-way-to-sort-positive-and-negative-feedback/

它将替换此textblob实现:

from textblob import TextBlob
from textblob.sentiments import NaiveBayesAnalyzer
TextBlob("I find your lack of faith disturbing.", analyzer=NaiveBayesAnalyzer())
{'neg': 0.182, 'pos': 0.817, 'combined': 0.635}
CONCLUSION: POSITIVE

nltk分类器还提供了更好的文档,说明如何使用您自己定制的语料库进行情感分析:http://www.nltk.org/howto/sentiment.html

textBlob总是使我的计算机崩溃,仅有5000个示例。

答案 2 :(得分:0)

另一个更具前瞻性的解决方案是使用spaCy构建模型,而不是textblobnltk。这对我来说是新手,但似乎更易于使用且功能更强大: https://spacy.io/usage/spacy-101#section-lightning-tour

  

“ spaCy是自然语言处理的Ruby of Rails。”

import spacy
import random

nlp = spacy.load('en') # loads the trained starter model here
train_data = [("Uber blew through $1 million", {'entities': [(0, 4, 'ORG')]})] # better model stuff

with nlp.disable_pipes(*[pipe for pipe in nlp.pipe_names if pipe != 'ner']):
    optimizer = nlp.begin_training()
    for i in range(10):
        random.shuffle(train_data)
        for text, annotations in train_data:
            nlp.update([text], [annotations], sgd=optimizer)
nlp.to_disk('/model')