NLP:word 2 vecでテキスト類似度を解析する

5039 ワード

一.中国語コーパス
中国語コーパスには主に以下のものがあります.
1.テンセントAI Labが2018年に共有した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.html2.中国語自然言語処理開放プラットフォームは中国科学院コンピューティング技術研究所・デジタル化室&ソフトウェア室が自然言語処理を研究するプラットフォームを創立し、その中に大量の訓練テスト語彙が含まれている.コーパス: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=153.sogouテキスト分類コーパステキスト分類コーパスは、Sohuニュースサイトに保存されている大量の編集を経て、分類されたニュースコーパスと対応する分類情報に由来する.その分類体系は数十個の分類ノードを含み、ウェブページの規模は約10万編のドキュメントである.アドレス: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) + '
') l = [] i = i + 1 if (i %200 == 0): print('Saved ' + str(i) + ' articles') f.close() if __name__ == '__main__': my_function()

三.訓練word 2 vec
# -*- 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.2つのテキストのキーワードを抽出する:TFIDFアルゴリズムで
2.テキストキーワードを計算訓練したword 2 vecでベクトルを加算した結果ベクトルになる
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('
') 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))