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)

 

posted @ 2018-09-14 10:13  默登  阅读(281)  评论(0)    收藏  举报