Привет всем!! Добро пожаловать во вторую часть учебной серии. Здесь мы начнем с базовой реализации алгоритмов из предыдущей статьи. Если вы упустили концепцию, оглянитесь назад. Здесь мы будем использовать 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 и т. Д. До следующего раза. Ваше здоровье!