gensimはtfidfとlsaの1つを使用します

3590 ワード

1、所与の訓練語彙は語彙のtfidfベクトルとlsiベクトルを生成する.
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).