word2vec做情感分析

摘要:本文旨在对情感分类任务的工作流程做一个简单的梳理,总结了大体框架,及一些需要注意的细节问题,作为总结。

目录

标题1.文本预处理

标题2.词带模型做文本表征

标题3.word2vec做词表征

标题4.用处理好的表征训练模型进行分类


标题1.文本预处理

无论用哪种模型进行文本表征或分类,第一步肯定是对数据进行预处理,做特征工程。

对影评数据做预处理,大概有以下环节:

1.用pandas读入数据,理解数据(可视化分析/统计信息)

对数据的理解是任何AI工作的第一步,需要充分对手上的数据有个更直观的理解。

统计一下在qlist 总共出现了多少个单词? 总共出现了多少个不同的单词?

统计一下qlist中每个单词出现的频率,并把这些频率排一下序,然后画成plot. 

2.去掉html标签

from bs4 import BeautifulSoup
# BeautifulSoup是一个专门处理网页爬下来的文本的库,可将里边的各种字符去掉。
example = BeautifulSoup(raw_example, 'html.parser').get_text()

3.移除标点

# 一般需要正则
example_letters = re.sub(r'[^a-zA-Z]', ' ', example)

4. 切分成词/token

words = example_letters.lower().split()

5. 去掉停用词

# 停用词可以用本地的也可用nltk等库里的,根据情况自己定
#words_nostop = [w for w in words if w not in stopwords.words('english')]
stopwords = {}.fromkeys([ line.rstrip() for line in open('../stopwords.txt')])
words_nostop = [w for w in words if w not in stopwords]

6. 重组为新的句子

#eng_stopwords = set(stopwords.words('english'))
eng_stopwords = set(stopwords)

def clean_text(text):
    text = BeautifulSoup(text, 'html.parser').get_text()
    text = re.sub(r'[^a-zA-Z]', ' ', text)
    words = text.lower().split()
    words = [w for w in words if w not in eng_stopwords]
    return ' '.join(words)

7. 另外还可以做stemming,lemenazitong(英文),去掉低频词,正则处理一些表情符号,邮箱等。这里需注意:Word2vec是需要上下文关系的,这里的停用词有时候不去掉效果可能会更好。

标题2.词带模型做文本表征

word2vec出现之前通常用词带模型进行表征,即每个词作为一个特征(通常取整个语料的前5000个词),词频作为特征值,进行文本表示。需用到sklearn中的countevectorizer方法。

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(max_features = 5000) 
train_data_features = vectorizer.fit_transform(df.clean_review).toarray()

 

标题3.word2vec做词表征

1.首先,第一步也是做预处理(如标题1)

tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')

raw_sentences = tokenizer.tokenize(review.strip())
sentences = [clean_text(s) for s in raw_sentences if s]

# nltk.data.load('tokenizers/punkt/english.pickle')加载英文的划分句子的模型

#tokenizers/punkt/ 这里面有好多训练好的模型,只能划分成句子,不能划分成单词

 2.用gensim训练处理好的文本

model = Word2Vec(sentences, workers=num_workers, \
            size=num_features, min_count = min_word_count, \
            window = context, sample = downsampling)

# If you don't plan to train the model any further, calling 
# init_sims will make the model much more memory-efficient.
model.init_sims(replace=True)

# It can be helpful to create a meaningful model name and 
# save the model for later use. You can load it later using Word2Vec.load()
model.save(os.path.join('..', 'models', model_name))

3.保存加载模型方法:

# 保存模型
# 第一种方法保存的文件不能利用文本编辑器查看,但是保存了训练的全部信息,可以在读取后追加训练
# 后一种方法保存为word2vec文本格式,但是保存时丢失了词汇树等部分信息,不能追加训练

model.save(os.path.join('..', 'models', model_name))

model.wv.save_word2vec_format(os.path.join('..','models','word2vec_txt.txt'),binary = False)
# 加载模型,根据保存时的格式不同,有两种加载方式

model = models.Word2Vec.load(os.path.join('..', 'models', model_name))
model_txt = models.KeyedVectors.load_word2vec_format(os.path.join('..','models','word2vec_txt.txt'),binary = False)

# 可以同时取出一个句子中单词的词向量
model.wv[['man','woman','guy']]

 

标题4.用处理好的表征训练模型进行分类

 

1.根据word2vec的结果去对影评文本进行编码,编码方式有一点粗暴,简单说来就是把这句话中的词的词向量做平均

def to_review_vector(review):
    words = clean_text(review, remove_stopwords=True)
    array = np.array([model[w] for w in words if w in model])
    return pd.Series(array.mean(axis=0))

2. 用随机森林分类器进行训练:

forest = RandomForestClassifier(n_estimators = 100, random_state=42)
forest = forest.fit(train_data_features, df.sentiment) 

 

 

参考:

https://www.cnblogs.com/Luv-GEM/p/10890010.html

https://blog.csdn.net/YoungshellZzz/article/details/88385801

https://blog.csdn.net/pit3369/article/details/95594728讲解了word2vec结合k-means聚类进行关键词提取的方法

你可能感兴趣的:(自然语言处理,python,机器学习)