NLP之sklearn--CountVectorizer
任务:根据历史的影评数据训练一个模型,当输入一句话时预测其输出。
# 导入所需的模块
import os
import re
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup # 网页解析(训练数据内容包含了html格式,要去掉)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix
import nltk
# nltk.download()
from nltk.corpus import stopwords
用pandas读入训练数据
datafile = os.path.join('..', 'data', 'labeledTrainData.tsv')
df = pd.read_csv(datafile, sep='\t')
print('训练集的数据样本个数为:%n' % (len(df)))
df.head()
![]()
对影评数据预处理,步骤大概有:
1、去掉html标签
2、删掉标点符号,比如逗号,句号,引号等
3、切分成词/token
4、去掉停用词
5、重组为新的句子
停用词处理:
stopwords = {}.fromkeys([ line.rstrip() for line in open('../stopwords.txt')])
eng_stopwords = set(stopwords) # 取集合,只会取到keys的集合
将预处理过程封装成函数
{}.fromkeys(seq, values):创建一个新字典,key为seq中的内容,value=values
如: seq = ('Google', 'Runoob', 'Taobao')
dict = {}.fromkeys(seq) 结果为:{'Google': None, 'Taobao': None, 'Runoob': None}
seq = ('Google', 'Runoob', 'Taobao')
dict = {}.fromkeys(seq, 10) 结果为:{'Google': 10, 'Taobao': 10, 'Runoob': 10}
def clean_text():
text = BeautifulSoup(text, 'html.parse').get_text() # 去掉标签
text = re.sub(r'[^a-zA-Z0-9]', ' ', text) # 将text中非字母数字全部替换为空格
words = text.lower().split() # 全部小写,以空格切分
words = [w for w in words if w not in eng_stopwords]
return ' '.join(words) # 将列表以指定的连接符连接起来(注意:列表元素为字符串时,直接用join)
将review这一列做清洗处理,然后再添加到DataFrame中
df['clean_review'] = df.review.apply(clean_text)
df.head()
![]()
用sklearn的CountVectorizer抽取特征
vectorizer = CountVectorizer(max_features=5000) # 词频中top5000的词拿出来
train_data_features = vectorizer.fit_transform(df.clean_review).toarray() # 想要展示成array格式必须要toarrsy()
train_data_features.shape
# (25000, 5000)
训练分类器
forest = RandomForestClassifier(n_estimators = 100)
forest = forest.fit(train_data_features, df.sentiment)
删除不用的占内容变量
del df
del train_data_features
读取测试数据进行预测(最好是一开始将训练和测试数据读进去,做完清洗后再分开)
datafile = os.path.join('..', 'data', 'testData.tsv')
df = pd.read_csv(datafile, sep='\t', escapechar='\\')
df['clean_review'] = df.review.apply(clean_text)
df.head()
![]()
对测试数据进行特征提取
test_data_features = vectorizer.transform(df.clean_review).toarray()
test_data_features.shape # (25000, 5000)
预测
result = forest.predict(test_data_features)
output = pd.DataFrame({'id':df.id, 'sentiment':result})
保存到文档
output.to_csv(os.path.join('..', 'data', 'Bag_of_Words_model.csv'), index=False)




浙公网安备 33010602011771号