gensimはtfidfとlsaの1つを使用します
3590 ワード
1、所与の訓練語彙は語彙のtfidfベクトルとlsiベクトルを生成する.
2、新しいテスト語彙に対して、tfidfとlsiで訓練語彙との類似度を判断する.
問題と思考:
1、LsiModelの中のnum_topic=50で、プリセットは最大50個のトピックがありますが、実際にはコーパスのみで15個のドキュメント、すなわち生成されたlsiベクトルの長さは15です.隠語義モデルとは,その本質はtopicを中間量とする.
2、LSIベクトルとは一体何なのか.ソースコードには以下のように解釈されているが,LSIベクトルは実際には右奇異値行列であり,各ドキュメントとトピックの対応関係であることがわかる.この場合、U∈ℝ^(m⨉t)は私たちの文書-主題行列であり、V∈ℝ^(n⨉t)は私たちの用語-主題行列となる.行列UとVでは、各列は私たちのt個の主題のうちの1つに対応する.Uでは、行は主題によって表現される文書の方向量を表し、Vでは、行は主題によって表現される用語ベクトルを表す.
2、新しいテスト語彙に対して、tfidfとlsiで訓練語彙との類似度を判断する.
import jieba
from gensim import corpora, models
from gensim.similarities import Similarity
#jieba.load_userdict("userdict.txt")
stopwords = set(open('./doc/stopword.txt',encoding='utf8').read().strip('
').split('
')) #
raw_documents = [ '0 ', '1 ', '2 ', '3 ', '4 ', '5 ', '6 ', '7 ', '8 ', '9 ', '10 1990 ', '11 ', '12 ?', '13 ', '14 ', '15 , ' ]
corpora_documents = []
for item_text in raw_documents:
item_str = jieba.lcut(item_text)
corpora_documents.append(item_str)
dictionary = corpora.Dictionary(corpora_documents)
print("dictionary"+str(dictionary))
# dictionary.save('dict.txt') #
#dictionary=Dictionary.load('dict.txt')#
# ( bow )
corpus = [dictionary.doc2bow(text) for text in corpora_documents]
# word
print("corpus:"+str(corpus))
# tf-idf
# corpus bow 。 corpus IDF
tfidf_model=models.TfidfModel(corpus)
corpus_tfidf = [tfidf_model[doc] for doc in corpus]
print(' TFIDF ',corpus_tfidf)
'''''
# model
for item in corpus_tfidf:
print(item)
# tfidf.save("data.tfidf")
# tfidf = models.TfidfModel.load("data.tfidf")
# print(tfidf_model.dfs)
'''
# lsi
lsi= models.LsiModel(corpus_tfidf,id2word=dictionary,num_topics=50)
corpus_lsi = [lsi[doc] for doc in corpus]
print(" LSI:"+str(corpus_lsi))
similarity_lsi=Similarity('Similarity-Lsi-index', corpus_lsi, num_features=400,num_best=5)
# 1.
test_data_1 = ' , , , '
test_cut_raw_1 = jieba.lcut(test_data_1)
print(' ',test_cut_raw_1)
# 2. bow # [(51, 1), (59, 1)], 52 60 ,
test_corpus_3 = dictionary.doc2bow(test_cut_raw_1)
print(' ',test_corpus_3)
# 3. tfidf # model, query TFIDF ,
test_corpus_tfidf_3 = tfidf_model[test_corpus_3]
print('TFIDF ',test_corpus_tfidf_3) # [(51, 0.7071067811865475), (59, 0.7071067811865475)]
# 4. lsi
test_corpus_lsi_3 = lsi[test_corpus_tfidf_3]
print('LSI ',test_corpus_lsi_3)
# lsi.add_documents(test_corpus_lsi_3) # LSI
print('——————————————lsi———————————————')
# ,(index_of_document, similarity) tuples
print(' :',similarity_lsi[test_corpus_lsi_3])
問題と思考:
1、LsiModelの中のnum_topic=50で、プリセットは最大50個のトピックがありますが、実際にはコーパスのみで15個のドキュメント、すなわち生成されたlsiベクトルの長さは15です.隠語義モデルとは,その本質はtopicを中間量とする.
2、LSIベクトルとは一体何なのか.ソースコードには以下のように解釈されているが,LSIベクトルは実際には右奇異値行列であり,各ドキュメントとトピックの対応関係であることがわかる.この場合、U∈ℝ^(m⨉t)は私たちの文書-主題行列であり、V∈ℝ^(n⨉t)は私たちの用語-主題行列となる.行列UとVでは、各列は私たちのt個の主題のうちの1つに対応する.Uでは、行は主題によって表現される文書の方向量を表し、Vでは、行は主題によって表現される用語ベクトルを表す.
Notes
-----
* :attr:`gensim.models.lsimodel.LsiModel.projection.u` - left singular vectors,
* :attr:`gensim.models.lsimodel.LsiModel.projection.s` - singular values,
* ``model[training_corpus]`` - right singular vectors (can be reconstructed if needed).