Helpex - Trao đổi & giúp đỡ Đăng nhập

Phân tích tình cảm đơn giản với NLP

Trong bài viết này, tôi sẽ phát triển một ứng dụng đơn giản về phân tích tình cảm bằng các kỹ thuật xử lý ngôn ngữ tự nhiên.

Phân tích tình cảm đơn giản với NLPTheo sự phát triển của Trí tuệ nhân tạo, số lượng ứng dụng Trí tuệ nhân tạo được phát triển để xử lý ngôn ngữ tự nhiên đang tăng lên từng ngày. Các ứng dụng được phát triển với NLP sẽ cho phép chúng tôi sử dụng cơ sở hạ tầng hoạt động nhanh hơn và chính xác hơn bằng cách loại bỏ sức người trong nhiều công việc. Các ví dụ phổ biến của các ứng dụng được phát triển với NLP là như sau.

  • Phân loại văn bản (Trình phát hiện thư rác, v.v.)
  • Phân tích tình cảm
  • Công nhận
  • Máy dịch
  • Chatbot s

Phân tích tình cảm là một trong những ứng dụng phổ biến nhất trong xử lý ngôn ngữ tự nhiên. Với phân tích tình cảm, chúng ta có thể quyết định cảm xúc nào được viết trong văn bản.

Với việc sử dụng rộng rãi các phương tiện truyền thông xã hội, nhu cầu phân tích nội dung mà mọi người chia sẻ trên phương tiện truyền thông xã hội đang tăng lên từng ngày. Xem xét khối lượng dữ liệu đến từ phương tiện truyền thông xã hội, khá khó khăn để làm điều này với sức mạnh của con người. Do đó, nhu cầu về các ứng dụng có thể nhanh chóng phát hiện và phản hồi các bình luận tích cực hoặc tiêu cực mà mọi người viết đang tăng lên từng ngày. Trong bài báo này, chúng tôi sẽ phát triển một mô hình cơ sở để phân tích đơn giản về tình cảm.

Trước hết, chúng tôi sẽ cung cấp cho bạn thông tin về tập dữ liệu mà chúng tôi sẽ thực hiện phân tích tình cảm.

Tên tập dữ liệu: Câu đã được gắn nhãn Câu tập dữ liệu

Nguồn dữ liệu: UCI Machine Learning Libarary

Thông tin về Tập dữ liệu: Tập dữ liệu này được tạo với các đánh giá của người dùng được thu thập qua 3 trang web khác nhau (Amazon, Yelp, Imdb). Những bình luận này bao gồm các đánh giá về nhà hàng, phim và sản phẩm. Mỗi bản ghi trong bộ dữ liệu được dán nhãn bằng hai biểu tượng cảm xúc khác nhau. Đây là 1: Tích cực, 0: Tiêu cực.

Chúng tôi sẽ tạo ra một mô hình phân tích tình cảm bằng cách sử dụng bộ dữ liệu chúng tôi đã đưa ra ở trên.

Chúng tôi sẽ xây dựng mô hình Machine Learning với ngôn ngữ lập trình Python bằng thư viện sklearn và nltk.

Bây giờ chúng ta có thể đi đến phần viết mã của chúng tôi.

Đầu tiên, hãy nhập các thư viện chúng ta sẽ sử dụng.

import pandas as pd
import numpy as np
import pickle
import sys
import os
import io
import re
from sys import path
import numpy as np
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt
from string import punctuation, digits
from IPython.core.display import display, HTML
from nltk.corpus import stopwords
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.tokenize import RegexpTokenizer

Bây giờ hãy tải lên và xem tập dữ liệu của chúng tôi.

#Amazon Data
input_file = "../data/amazon_cells_labelled.txt"
amazon = pd.read_csv(input_file,delimiter='\t',header=None)
amazon.columns = ['Sentence','Class']

#Yelp Data
input_file = "../data/yelp_labelled.txt"
yelp = pd.read_csv(input_file,delimiter='\t',header=None)
yelp.columns = ['Sentence','Class']

#Imdb Data
input_file = "../data/imdb_labelled.txt"
imdb = pd.read_csv(input_file,delimiter='\t',header=None)
imdb.columns = ['Sentence','Class']


#combine all data sets
data = pd.DataFrame()
data = pd.concat([amazon, yelp, imdb])
data['index'] = data.index

data

Phân tích tình cảm đơn giản với NLPCó, chúng tôi đã nhập dữ liệu và xem nó. Bây giờ, hãy nhìn vào số liệu thống kê về dữ liệu.

#Total Count of Each Category
pd.set_option('display.width', 4000)
pd.set_option('display.max_rows', 1000)
distOfDetails = data.groupby(by='Class', as_index=False).agg({'index': pd.Series.nunique}).sort_values(by='index', ascending=False)
distOfDetails.columns =['Class', 'COUNT']
print(distOfDetails)

#Distribution of All Categories
plt.pie(distOfDetails['COUNT'],autopct='%1.0f%%',shadow=True, startangle=360)
plt.show()

Phân tích tình cảm đơn giản với NLPNhư bạn có thể thấy, tập dữ liệu rất cân bằng. Có số lượng gần như bằng nhau của các lớp tích cực và tiêu cực.

Bây giờ, trước khi sử dụng tập dữ liệu trong mô hình, chúng ta hãy làm một vài điều để xóa văn bản (xử lý trước).

#Text Preprocessing
columns = ['index','Class', 'Sentence']
df_ = pd.DataFrame(columns=columns)

#lower string
data['Sentence'] = data['Sentence'].str.lower()

#remove email adress
data['Sentence'] = data['Sentence'].replace('[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', '', regex=True)

#remove IP address
data['Sentence'] = data['Sentence'].replace('((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', '', regex=True)

#remove punctaitions and special chracters
data['Sentence'] = data['Sentence'].str.replace('[^\w\s]','')

#remove numbers
data['Sentence'] = data['Sentence'].replace('\d', '', regex=True)

#remove stop words
for index, row in data.iterrows():
    word_tokens = word_tokenize(row['Sentence'])
    filtered_sentence = [w for w in word_tokens if not w in stopwords.words('english')]
    df_ = df_.append({"index": row['index'], "Class":  row['Class'],"Sentence": " ".join(filtered_sentence[0:])}, ignore_index=True)

data = df_

Chúng tôi đã làm sạch trước dữ liệu sẵn sàng để sử dụng trong mô hình. Bây giờ, trước khi chúng tôi xây dựng mô hình của mình, hãy chia nhỏ dữ liệu của chúng tôi để kiểm tra (10%) và đào tạo (90%).

X_train, X_test, y_train, y_test = train_test_split(data['Sentence'].values.astype('U'),data['Class'].values.astype('int32'), test_size=0.10, random_state=0)
classes  = data['Class'].unique()

Bây giờ chúng tôi có thể tạo mô hình của chúng tôi bằng cách sử dụng dữ liệu đào tạo của chúng tôi. Khi tạo mô hình, tôi sẽ sử dụng TF-IDF làm vector hóa và thuật toán Stochastic Gradient Descend làm trình phân loại. Chúng tôi đã tìm thấy các phương thức này và các tham số trong phương thức bằng cách sử dụng tìm kiếm lưới (tôi sẽ không đề cập đến tìm kiếm lưới trong bài viết này).

from sklearn.metrics import confusion_matrix
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
from sklearn.neural_network import MLPClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import SGDClassifier


#grid search result
vectorizer = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.5,use_idf=True, norm='l2') 
counts = vectorizer.fit_transform(X_train)
vocab = vectorizer.vocabulary_
classifier = SGDClassifier(alpha=1e-05,max_iter=50,penalty='elasticnet')
targets = y_train
classifier = classifier.fit(counts, targets)
example_counts = vectorizer.transform(X_test)
predictions = classifier.predict(example_counts)

Mô hình của chúng tôi đã xảy ra. Bây giờ hãy kiểm tra mô hình của chúng tôi với dữ liệu thử nghiệm. Hãy kiểm tra độ chính xác, độ chính xác, thu hồi và kết quả F1.

from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import classification_report

#Model Evaluation
acc = accuracy_score(y_test, predictions, normalize=True)
hit = precision_score(y_test, predictions, average=None,labels=classes)
capture = recall_score(y_test, predictions, average=None,labels=classes)

print('Model Accuracy:%.2f'%acc)
print(classification_report(y_test, predictions))


Model Accuracy:0.83
             precision    recall  f1-score   support

          0       0.83      0.84      0.84       139
          1       0.84      0.82      0.83       136

avg / total       0.83      0.83      0.83       275



Như chúng ta đã thấy, sự thành công của mô hình của chúng tôi là 83%. Bây giờ hãy xem ma trận nhầm lẫn, nơi chúng ta có thể thấy rõ hơn mức độ chính xác của các ước tính của chúng tôi.

#source: https://www.kaggle.com/grfiv4/plot-a-confusion-matrix
import itertools
def plot_confusion_matrix(cm, classes,
                          normalize=False,
                          title='Confusion matrix',
                          cmap=plt.cm.Blues):
    """
    This function prints and plots the confusion matrix.
    Normalization can be applied by setting `normalize=True`.
    """
    if normalize:
        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
        #print("Normalized confusion matrix")
    else:
        print()

    plt.imshow(cm, interpolation='nearest', cmap=cmap, aspect='auto')
    plt.title(title)
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks, classes, rotation=45)
    plt.yticks(tick_marks, classes)

    fmt = '.2f' if normalize else 'd'
    thresh = cm.max() / 2.
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
        plt.text(j, i, format(cm[i, j], fmt),
                 horizontalalignment="center",
                 color="white" if cm[i, j] > thresh else "black")

    plt.tight_layout()
    plt.ylabel('True label')
    plt.xlabel('Predicted label')
    plt.figure(figsize=(150,100))
# Compute confusion matrix
cnf_matrix = confusion_matrix(y_test, predictions,classes)
np.set_printoptions(precision=2)

class_names = range(1,classes.size+1)

# Plot non-normalized confusion matrix
plt.figure()
plot_confusion_matrix(cnf_matrix, classes=class_names,title='Confusion matrix, without normalization')

classInfo = pd.DataFrame(data=[])
for i in range(0,classes.size):
    classInfo = classInfo.append([[classes[i],i+1]],ignore_index=True)

classInfo.columns=['Category','Index']
classInfo

Phân tích tình cảm đơn giản với NLPVới nghiên cứu này, chúng tôi đã phát triển một dự án Xử lý ngôn ngữ tự nhiên. Như tôi đã nói ở đầu bài viết, mô hình của chúng tôi là một mô hình cơ bản. Mục đích của bài viết này là phát triển một ứng dụng có thể được coi là giới thiệu về Xử lý ngôn ngữ tự nhiên. Tôi hy vọng đã có một bài viết hữu ích về nhận thức.

4 hữu ích 0 bình luận 12k xem chia sẻ

Có thể bạn quan tâm

loading