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
私はウィキペディアのコーパスを採用しています.
二.コーパス前処理
ウィキペディアの中国語コーパスは繁体字をベースにしているので、簡体字に変換します
三.訓練word 2 vec
四.テキスト類似度の計算
テキストの類似度を計算する方法は、次のとおりです.
1.2つのテキストのキーワードを抽出する:TFIDFアルゴリズムで
2.テキストキーワードを計算訓練したword 2 vecでベクトルを加算した結果ベクトルになる
3.両テキストベクトルの類似度、すなわちテキストの類似度を計算する.
中国語コーパスには主に以下のものがあります.
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))