Привет всем!! Добро пожаловать во вторую часть учебной серии. Здесь мы начнем с базовой реализации алгоритмов из предыдущей статьи. Если вы упустили концепцию, оглянитесь назад. Здесь мы будем использовать nltk для реализации алгоритма, и мы будем использовать алгоритмы sklearns для тестирования кода. TL; DR - Если вам просто нужен код, пожалуйста.
Также, примечание, я только что затронул некоторые из наиболее важных тем в предыдущей статье. На будущее: POS - это часть речи, то есть существительные, глаголы, прилагательные и т. Д.
Начнем с импорта нескольких библиотек.
import pandas as pd import numpy as np import matplotlib.pyplot as plt import nltk import re from nltk.stem.wordnet import WordNetLemmatizer from nltk.corpus import stopwords from nltk import word_tokenize from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier
Выше приведены необработанные текстовые данные обзоров фильмов на IMDB. Мы будем использовать набор данных из 1000 отзывов. Вы можете получить набор данных из моего репозитория на github или просто погуглить. Нам нужно будет предварительно обработать данные и векторизовать их. Здесь мы будем использовать TF-IDF Vectorizer из sklearn. Вы также можете сравнить производительность Count Vectorizer с этим.
def remove_stopwords(text): words = word_tokenize(text) output_text = [] for w in words: if w not in stop_words: output_text.append(w) output_text = ‘ ‘.join(output_text).replace(‘ , ‘,’,’).replace(‘ .’,’.’).replace(‘ !’,’!’) output_text = output_text.replace(‘ ?’,’?’).replace(‘ : ‘,’: ‘).replace(‘ \’’, ‘\’’) return output_text def preprocessing_data(raw_data, lemmatizer): preprocessed_data = [] for data in raw_data: data = data.lower() data = remove_stopwords(data) data = lemmatizer.lemmatize(data) data = ‘ ‘.join(re.sub(“(@[_A-Za-z0–9]+)|([⁰-9A-Za-z \t])|(\w+:\/\/\S+)”,” “,data).split()) preprocessed_data.append(data) return preprocessed_data def pos(tokenized_tweet): return nltk.pos_tag(tokenized_tweet) def pos_data(pre_data): posData = [] for d in pre_data: pdata = pos(d.split())[:] for i in range(len(pdata)): pdata[i] = pdata[i][1] posData.append(‘ ‘.join(pdata)) return posData text_vectorizer = TfidfVectorizer( tokenizer = None, preprocessor = None, decode_error = 'replace', stop_words = None, ngram_range = (1,3), max_features=10000, min_df=5, max_df=0.75, norm = None ) pos_vectorizer = TfidfVectorizer( tokenizer=None, lowercase=False, preprocessor=None, ngram_range=(1, 3), stop_words=None, use_idf=False, smooth_idf=False, norm=None, decode_error='replace', max_features=5000, min_df=5, max_df=0.75, )
Предварительно обработанные данные будут выглядеть примерно так
Мы будем использовать как логистическую регрессию, так и дерево решений, чтобы проверить результат.
pre_data = text_vectorizer.fit_transform(pd.Series(pre_data)).toarray() pos_data = pos_vectorizer.fit_transform(pd.Series(pos_pre_data)).toarray() train_data = np.concatenate((pre_data, pos_data), axis = 1) train_x, test_x, train_y, test_y = train_test_split(train_data, labels) log_reg = LogisticRegression() log_reg.fit(train_x, train_y) print(log_reg.score(test_x, test_y)) dec_tree = DecisionTreeClassifier() dec_tree.fit(train_x, train_y) print(dec_tree.score(test_x, test_y))
Мы получили оценку 0,75 по логистической регрессии и 0,67 по дереву решений. Это связано с тем, что логистическая регрессия присваивает веса векторам, тогда как дерево решений выполняет сравнения для получения прогноза.
Итак, вот он, ребята, первый простой код для анализа настроений. В следующей статье я расскажу о рекуррентных нейронных сетях и различных типах RNN, таких как LSTM, GRU и т. Д. До следующего раза. Ваше здоровье!