参考链接:Word2Vec词向量训练、使用及可视化操作
gensim=3.5 matplotlib=3.4
数据采用中文文本分类数据集—cnews数据集,该数据中含有标签、内容。这里我们仅取内容,对内容进行处理。
cnews数据集下载:链接:cnews数据集 提取码:iuna
中文停用词链接:用于中文文本分类的中文停用词
1.输入数据处理
jieba
分词----->去掉停用词----->去除’['
、']'
、逗号
、单引号
、行末尾换行符
----->以UTF-8
保存为.txt
文本格式。如下图所示。
代码如下所示:
import re
import jieba as jb
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取原始文本信息
sentences = []
for line in open("cnews.txt", "r", encoding="utf-8"):
items = line.split('\t')
_, sentence = items[0], items[1]
sentences.append(sentence)
# (1)首先定义一个函数,删除除字母、数字和汉字以外的所有符号,并保存在clear1_sentences中,为后期进行jieba分词做初步准备
def remove_punctuation(readline):
line_1 = str(readline)
if line_1.strip() == '':
return ''
rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")
line_1 = rule.sub('', line_1)
return line_1
clear1_sentences = []
for sentence in sentences:
clear1_sentences.append(remove_punctuation(sentence))
# (2)然后进行jieba分词,通过停用词表,对clear1_sentences进行二次清洗
# (2.1)加载停用词表
stopwords = [line.strip() for line in open("chinesStopWords.txt", encoding='utf-8').readlines()]
# (2.2)进行jieba分词,并过滤停用词,之后保存在clear2_sentences中
clear2_sentences = []
print('--------------------------------')
for sentence in clear1_sentences:
flag_sentence = []
for w in list(jb.cut(sentence)):
if w not in stopwords:
flag_sentence.append(w)
clear2_sentences.append(flag_sentence)
# (2.3)分词之后,还存在'['、']'、逗号、单引号、末尾换行符,需要进行三次清洗去除这些符号,并保存在'分词处理后的文本.txt'的文本中。注意:以utf-8进行保存。
with open('分词处理后的文本.txt', 'w', encoding='utf-8') as f:
for i in range(len(clear2_sentences)):
s = str(clear2_sentences[i]).replace('[', '').replace(']', '') # 去除‘[’和‘]’,这两行按数据不同,可以选择
s = s.replace("'", '').replace(',', '') + '\n' # 去除单引号,逗号,每行末尾追加换行符
f.write(s)
2.词向量训练
通过LineSentence(open('分词处理后的文本.txt', 'r', encoding='utf8'))
对分词后的文本数据进行读取。使用LineSentence方法
可避免前期构建语料的复杂性。然后就是模型训练、保存。代码如下:
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
model = Word2Vec(
LineSentence(open('分词处理后的文本.txt', 'r', encoding='utf8')),
sg=0,
size=100,
window=3,
min_count=1,
workers=8)
# 模型保存
model.save('train.model')
3.词向量使用
加载模型,代码如下: