主要步骤流程:

文本预处理:分词

训练词向量

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计算文本相似度:

Word2vec计算文本相似度的基本方法是:提取文本中的关键词,接着将关键词向量化,然后将得到的各个词向量相加,最后得到的一个词向量总和代表文本向量化表示,利用总的向量计算网页相似度。包括的步骤是:1、关键词提取,2、关键词向量化,3、相似度计算。

关键词提取

这里采用的是jieba工具包中tf-idf关键词提取算法。提取结果如下:

自然语言处理文本相似度 文本语义相似度计算_tf-idf_02

关键词向量化

从txt文件中读取关键词,利用之前训练好的词向量获取关键词的词向量。

相似度计算

通过余弦相似度计算向量的相似度,并返回top10。

训练结果:

自然语言处理文本相似度 文本语义相似度计算_自然语言处理文本相似度_03