После обучения моего собственного классификатора с помощью nltk, как мне загрузить его в 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 'nltk.classify.naivebayes.NaiveBayesClassifier'> - и попытался передать его в 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 ответа
Я не был уверен, что корпус 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 делает намного больше разбора языка отрицания в предложениях, чтобы отрицать положительные слова. Например, когда Дарт Вейдер говорит "отсутствие веры", это меняет настроение на противоположное.
Я объяснил это здесь, с примерами лучших результатов: 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 примеров.
Переходя к сообщению об ошибке, кажется, что анализатор должен быть унаследован от абстрактного класса BaseSentimentAnalyzer
, Как уже упоминалось в документации, этот класс должен реализовывать analyze(text)
функция. Однако, проверяя документы по реализации NLTK, я не смог найти этот метод в его основной документации здесь или в его родительском классе. ClassifierI
здесь Следовательно, я считаю, что обе эти реализации не могут быть объединены, если вы не можете реализовать новую analyze
функция в реализации NLTK, чтобы сделать его совместимым с TextBlob.
Другое более перспективное решение - использовать spaCy для построения модели вместо textblob
или же nltk
, Это новое для меня, но, кажется, намного проще в использовании и более мощное: https://spacy.io/usage/spacy-101
"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')