Python:用Word2Vec 和 sklearn 对IMDB评论进行分类训练
之前一直做的是目标跟踪上的东西,这几天在看这本书又看到NLP,两者均作为对数据序列的处理,应该是有共通点的,于是就简单摸索了一下。
在NLP建立由词到向量的映射最简单的方法是bag of words,粗暴直接,没准还效果拔群。
但是bag of words 没法表达出词与词之间联系与相似程度,功能上还是有些粗糙,所以就考虑用Word2Vec将词映射到向量空间,再进行分类训练。
这次的工作主要就是一些书上教程和word2vec的结合
需要用到的module
- sklearn
- nltk
- gensim
不是什么偏门模块,直接anaconda里面install就行,conda没有就pip
数据来源
爬网页什么的就算了,我也搞不了那么大的,直接找现成的。(我是拒绝承认我是因为知道了这个数据才做这项工作的)。
这个数据集里面把IMDB评分在5以上的都视作positive sample,5以下的视作 negative sample
数据预处理
- 借用了nltk的 stopwords 集,就是那些像 i, you, is 之类的没啥营养哪都出现频率还死高的词。用来把他们从训练集中清除。
- pyprind看个进度
还有个对符号表情的提取,比如:-)但是这一套东西,不管是stopwords还是表情符号,都是基于英语环境的,对于中文还是不行,或者是有类似的成果只是我孤陋寡闻。(我就对这种
(~ ̄▽ ̄)~ 还有这种 (눈‸눈) 搞出通用的识别方法的难度表示关切)把原始的txt整理成为csv
# -*- coding: utf-8 -*-
import pyprind
import pandas as pd
import os
from nltk.corpus import stopwords
import re
import numpy as np
stop = stopwords.words('english')
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) +\
' '.join(emoticons).replace('-', '')
tokenized = [w for w in text.split() if w not in stop]
return tokenized
basepath =