主要步骤流程:
文本预处理:分词
训练词向量
tf-idf提取关键词并写入文档 前20个词
word2vec读取提取的关键词并转为词向量
相似度计算。
前面对word2vec的理论进行了介绍,接下来进入实战环节。实践主要分为三部分,word2vec训练,相似度计算以及训练结果展示三部分。
词向量的训练主要分为两部分:
1、对中文语料进行数据预处理;
2、利用gensim模块训练词向量。
中文语料处理:
在用语料库进行训练词向量之前需要对中文句子进行分词,这里采用jieba中文分词工具对句子进行分词。具体代码如下:
import GrobalParament
import jieba
import pandas as pd
#去掉回车换行
def delete_r_n(line):
return line.replace("\r","").replace("\n","").strip()
#读取停用词
def get_stop_words(stop_words_dir):
stop_words = []
with open(stop_words_dir, "r", encoding=GrobalParament.encoding) as f_reader:
for line in f_reader:
line = delete_r_n(line)
stop_words.append(line)
stop_words = set(stop_words)
return stop_words
#结巴精准分词
def jieba_cut(content, stop_words):
word_list = []
if content != "" and content is not None:
seg_list = jieba.cut(content)
for word in seg_list:
if word not in stop_words:
word_list.append(word)
return word_list
#结巴索索引擎分词
def jieba_cut_for_search(content, stop_words):
word_list = []
if content != "" and content is not None:
seg_list = jieba.cut_for_search(content)
for word in seg_list:
if word not in stop_words:
word_list.append(word)
return word_list
#清除不在词汇表中的词语
def clear_word_from_vocab(word_list, vocab):
new_word_list = []
for word in word_list:
if word in vocab:
new_word_list.append(word)
return new_word_list
#文本预处理
def preprocessing_text_pd(text_dir, after_process_text_dir, stop_words_dir):
stop_words = get_stop_words(stop_words_dir)
setences = []
df = pd.read_csv(text_dir)
for index, row in df.iterrows():
print(index)
title = delete_r_n(row['title'])
word_list = jieba_cut(title, stop_words)
df.loc[index,'title'] = " ".join(word_list)
setences.append(word_list)
df.to_csv(after_process_text_dir,encoding=GrobalParament.encoding, index=False)
return setences
#文本预处理第二种方式
def preprocessing_text(text_dir, after_process_text_dir, stop_words_dir):
stop_words = get_stop_words(stop_words_dir)
setences = []
f_writer = open(after_process_text_dir,"w", encoding=GrobalParament.encoding)
count = 0
with open(text_dir, "r", encoding=GrobalParament.encoding) as f_reader:
for line in f_reader:
line_list = line.split(",")
if len(line_list) == 2:
line_list[1] = delete_r_n(line_list[1])
word_list = jieba_cut(line_list[1], stop_words)
setences.append(word_list)
f_writer.write(line_list[0] + "," + " ".join(word_list) + "\n")
f_writer.flush()
count = count + 1
print(count)
else:
pass
# print(line)
f_writer.close()
return setences
if __name__ == "__main__":
stop_words = get_stop_words(GrobalParament.stop_word_dir)
setences = preprocessing_text(GrobalParament.test_set_dir, GrobalParament.test_after_process_text_dir, GrobalParament.stop_word_dir)
# setences = preprocessing_text_pd(GrobalParament.train_set_dir, GrobalParament.train_after_process_text_dir, GrobalParament.stop_word_dir)
#print(setences[:10])
最后将处理后的语料存入txt文档中,处理后的语料如下图所示:
向量化训练:
利用gensim模块训练词向量。之前有详细介绍训练方法和参数设置,这里不再累赘。
import GrobalParament
import utils
from gensim.models import word2vec
#训练word2vec
def train(sentences, model_out_put_path):
print("开始训练")
model = word2vec.Word2Vec(sentences = sentences, size = GrobalParament.train_size, window = GrobalParament.train_window, min_count = 20)
model.save(model_out_put_path)
print("训练完成")
if __name__ == "__main__":
# sentences = utils.preprocessing_text(GrobalParament.train_set_dir, GrobalParament.train_after_process_text_dir, GrobalParament.stop_word_dir)
# train(sentences, GrobalParament.model_output_path)
model = word2vec.Word2Vec.load(GrobalParament.model_output_path)
vocab = list(model.wv.vocab.keys())
for e in model.most_similar(positive = ['漏水'], topn = 10):
print(e[0],e[1])
print(len(vocab))
Word2vec计算文本相似度的基本方法是:提取文本中的关键词,接着将关键词向量化,然后将得到的各个词向量相加,最后得到的一个词向量总和代表文本向量化表示,利用总的向量计算网页相似度。包括的步骤是:1、关键词提取,2、关键词向量化,3、相似度计算。
关键词提取
这里采用的是jieba工具包中tf-idf关键词提取算法。提取结果如下:
关键词向量化
从txt文件中读取关键词,利用之前训练好的词向量获取关键词的词向量。
相似度计算
通过余弦相似度计算向量的相似度,并返回top10。