概述
情感分析有时也被称为意见挖掘,是NLP广泛领域中的一个分支,着重于分析文档的倾向。情感分析的一个热门任务是根据作者对特定主题所表达的观点或情感为文档分类。这里将训练一个逻辑回归模型来把电影评论分类为正面和负面
import pandas as pd
import re
import os
from nltk.stem.porter import PorterStemmer
import nltk
from nltk.corpus import stopwords
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import GridSearchCV
df = pd.read_csv('xxx\movie_data.csv', encoding='utf-8')
print(df.head())
# 去掉所有不需要的字符来清洗文本数据
def preprocessor(text):
# 对于输入的一个字符串,利用正则表达式(的强大的字符串处理功能),去实现(相对复杂的)字符串替换处理,然后返回被替换后的字符串
text = re.sub(r'<[^>]*>', '', text)
# findall()返回的是括号所匹配到的结果,多个括号就会返回多个括号分别匹配到的结果,
# 如果没有括号就返回就返回整条语句所匹配到的结果。
emoticons = re.findall(r'(?::|:|=)(?:-)?(?:)|(|D|P)', text) # 以列表的形式返回能匹配的子串
text = (re.sub(r'[W]+', ' ', text.lower()) +
' '.join(emoticons).replace('-', ''))
return text
df['review'] = df['review'].apply(preprocessor)
# 标记文件的一种方法是通过把清洗后的文件以空白字符拆分为单词
def tokenizer(text):
return text.split()
# 关于文档的标记化,还有另外一种有用的技术是词干,就是将单词转换为词根的过程
porter = PorterStemmer()
def tokenizer_porter(text):
return [porter.stem(word) for word in text.split()]
# 去除电影评论中的停用词(127个)
stop = stopwords.words('english')
X_train = df.loc[:25000, 'review'].values
y_train = df.loc[:25000, 'sentiment'].values
X_test = df.loc[25000:, 'review'].values
y_test = df.loc[25000:, 'sentiment'].values
# TfidfTransformer类,以原始词频为输入,然后转换为tf-idfs格式即通过词频逆反文档频率评估单词相关性
# CountVectorizer类根据单词在各文件中出现的频 率构建词袋模型
# TfidfTransformer + CountVectorizer = TfidfVectorizer
# lowercase:在令牌标记前转换所有的字符为小写
# preprocessor:当保留令牌和”n-gram“生成步骤时,覆盖预处理(字符串变换)的阶段
# norm:范数用于标准化词条向量。None为不归一化
# use_idf:启动inverse-document-frequency重新计算权重
# smooth_idf:通过加1到文档频率平滑idf权重,为防止除零,加入一个额外的文档
# stop_words:string {'english'}, list, or None(default)
# 如果未english,用于英语内建的停用词列表
# 如果未list,该列表被假定为包含停用词,列表中的所有词都将从令牌中删除
# 如果None,不使用停用词。
# tokenizer:当保留预处理和n-gram生成步骤时,覆盖字符串令牌步骤
tfidf = TfidfVectorizer(strip_accents=None,
lowercase=False,
preprocessor=None)
param_grid = [{'vect__ngram_range': [(1, 1)],
'vect__stop_words': [stop, None],
'vect__tokenizer': [tokenizer, tokenizer_porter],
'clf__penalty': ['l1', 'l2'],
'clf__C': [1.0, 10.0, 100.0]}, # 通过定义逆正则化参数C的取值范围来比较正则化的强度
{'vect__ngram_range': [(1, 1)],
'vect__stop_words': [stop, None],
'vect__tokenizer': [tokenizer, tokenizer_porter],
'vect__use_idf':[False],
'vect__norm':[None],
'clf__penalty': ['l1', 'l2'],
'clf__C': [1.0, 10.0, 100.0]},
]
lr_tfidf = Pipeline([('vect', tfidf),
('clf', LogisticRegression(random_state=0))])
# 调用GridSearchCV对象,采用5倍分层交叉验证方法,为逻辑回归模型寻找最佳的参数集
gs_lr_tfidf = GridSearchCV(lr_tfidf, param_grid,
scoring='accuracy',
cv=5,
verbose=1,
n_jobs=-1)
if 'TRAVIS' in os.environ:
gs_lr_tfidf.verbose=2
X_train = df.loc[:250, 'review'].values
y_train = df.loc[:250, 'sentiment'].values
X_test = df.loc[25000:25250, 'review'].values
y_test = df.loc[25000:25250, 'sentiment'].values
gs_lr_tfidf.fit(X_train, y_train)
print('Best parameter set: %s ' % gs_lr_tfidf.best_params_)
print('CV Accuracy: %.3f' % gs_lr_tfidf.best_score_)
clf = gs_lr_tfidf.best_estimator_
print('Test Accuracy: %.3f' % clf.score(X_test, y_test))
数据量太大,这里不跑了,执行时间过长。最后结果表明机器学习模型能以90%的准确率来预测电影评论是正面还是负面。
最后
以上就是腼腆发带为你收集整理的机器学习算法--python实现应用机器学习于情感分析-训练文档分类的全部内容,希望文章能够帮你解决机器学习算法--python实现应用机器学习于情感分析-训练文档分类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复