NLP:用word2vec分析文本相似度

一.中文语料库

中文语料库主要有以下几种:

1. 腾讯AI Lab2018年分享的开源800万中文词的NLP数据集文章https://mp.weixin.qq.com/s?__biz=MzIzNjc1NzUzMw==&mid=2247506252&idx=4&sn=1f883532975737c9df02212fc2ae1ca5&chksm=e8d06e3edfa7e728ee0f1ae592e03cee5c818a5b731a0f0560672323894a2304758698b52f37&mpshare=1&scene=1&srcid=1019nHpV0cUEBOk3Z25cuPgA#rd
下载链接为https://ai.tencent.com/ailab/nlp/embedding.html
2. 中文自然语言处理开放平台
由中国科学院计算技术研究所·数字化室&软件室创立一个研究自然语言处理的一个平台,里面包含有大量的训练测试语料。
语料库: http://www.nlp.org.cn/docs/doclist.php?cat_id=9&type=15
文本语料库: http://www.nlp.org.cn/docs/doclist.php?cat_id=16&type=15
3. sogou文本分类语料库
文本分类语料库来源于Sohu新闻网站保存的大量经过编辑手工整理与分类的新闻语料与对应的分类信息。其分类体系包括几十个分类节点,网页规模约为十万篇文档。
地址: http://www.sogou.com/labs/dl/c.html
维基百科中文网页下载资源: https://dumps.wikimedia.org/zhwiki/lastest/zhwiki-lastest-pages-articles.xml.bz2

我采用是维基百科语料库

二. 语料库预处理

因为维基百科的中文语料库是在繁体文字的基础上做的,所以要转化为简体文字

# -*- coding: utf-8 -*-
"""
 中文语料预处理:转化为简体字.
"""
from gensim.corpora import WikiCorpus
import jieba
from langconv import *

def my_function():
    space = ' '
    i = 0
    l = []
    zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'
    f = open('./data/reduce_zhiwiki.txt', 'w',encoding='utf-8')
    # xml文件中读出训练语料
    wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        for temp_sentence in text:
            # 繁体字转换为简体
            temp_sentence = Converter('zh-hans').convert(temp_sentence)
            # 分词
            seg_list = list(jieba.cut(temp_sentence))
            for temp_term in seg_list:
                l.append(temp_term)
        f.write(space.join(l) + '\n')
        l = []
        i = i + 1

        if (i %200 == 0):
            print('Saved ' + str(i) + ' articles')
    f.close()


if __name__ == '__main__':
    my_function()

三.训练word2vec

# -*- coding: utf-8 -*-
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

def my_train_function():
    wiki_news = open('./data/reduce_zhiwiki.txt', 'r')
    model = Word2Vec(LineSentence(wiki_news), sg=0, size=192, window=5, min_count=5, workers=9)
    model.save('zhiwiki_news.word2vec')

if __name__ == '__main__':
    my_train_function()

 

四.计算文本相似度

计算文本相似度的思路是:

1.提取两个文本的关键字:用TFIDF算法

2.计算文本关键词在训练好的word2vec中向量累加的结果变成向量

3.计算两文本向量的相似度即为文本的相似度。

# -*- coding: utf-8 -*-
import jieba.posseg as pseg
import analyse from jieba
import codecs
import numpy
import gensim
import numpy as np

# 提取关键字
def keyword_extract(data):
   tfidf = analyse.extract_tags
   keywords = tfidf(data)
   return keywords

#提取全文关键字
def getKeywords(docpath, savepath):
   with open(docpath, 'r') as docf, open(savepath, 'w') as outf:
      for data in docf:
         data = data[:len(data)-1]
         keywords = keyword_extract(data, savepath)
         for word in keywords:
            outf.write(word + ' ')
         outf.write('\n')

wordvec_size=192
def get_char_pos(string,char):
    chPos=[]
    try:
        chPos=list(((pos) for pos,val in enumerate(string) if(val == char)))
    except:
        pass
    return chPos

#用训练好的模型和关键字计算文本向量
def word2vec(file_name,model):
    with codecs.open(file_name, 'r') as f:
        word_vec_all = numpy.zeros(wordvec_size)
        for data in f:
            space_pos = get_char_pos(data, ' ')
            first_word=data[0:space_pos[0]]
            if model.__contains__(first_word):
                word_vec_all= word_vec_all+model[first_word]
            for i in range(len(space_pos) - 1):
                word = data[space_pos[i]:space_pos[i + 1]]
                if model.__contains__(word):
                    word_vec_all = word_vec_all+model[word]
        return word_vec_all

#计算相似度
def simlarityCalu(vector1,vector2):
    vector1Mod=np.sqrt(vector1.dot(vector1))
    vector2Mod=np.sqrt(vector2.dot(vector2))
    if vector2Mod!=0 and vector1Mod!=0:
        simlarity=(vector1.dot(vector2))/(vector1Mod*vector2Mod)
    else:
        simlarity=0
    return simlarity

if __name__ == '__main__':
    model = gensim.models.Word2Vec.load('data/zhiwiki_news.word2vec')
    t1 = './data/T1.txt'
    t2 = './data/T2.txt'
    t1_keywords = './data/T1_keywords.txt'
    t2_keywords = './data/T2_keywords.txt'
    getKeywords(t1, t1_keywords)
    getKeywords(t2, t2_keywords)
    p1_vec=word2vec(t1_keywords,model)
    p2_vec=word2vec(t2_keywords,model)
    print('T1文本和T2文本的相似度:'+simlarityCalu(p1_vec,p2_vec))

 

你可能感兴趣的:(NLP)