In [1]:
from gensim import corpora, models, similarities
from nltk.corpus import brown
import nltk
import re
In [2]:
dictb = corpora.Dictionary([[word.lower() for word in sent]
for sent in brown.sents()])
print dictb
In [3]:
stopid = [dictb.id2token[w] for w in nltk.corpus.stopwords.words('english')
if w in dictb.keys()]
onceid = [id for id, freq in dictb.dfs.iteritems() if freq == 1]
numberid = [id for id, word in dictb.items() if any(char.isdigit() for char in word)]
print len(stopid + onceid + numberid)
In [4]:
dictb.filter_tokens(stopid + onceid + numberid)
dictb.compactify()
print dictb
In [5]:
corpus = [dictb.doc2bow([w.lower() for w in sent]) for sent in brown.sents()]
In [6]:
corpora.MmCorpus.serialize('brown.mm', corpus)
dictb.save('brown.dict')
In [7]:
tfidf = models.TfidfModel(corpus) # 第一步,產生model
In [8]:
tfidf[corpus[0]] # 第二步,轉換vector
Out[8]:
注意: 呼叫model[corpus]
是即時運算,結果不會保存,所以每次所需的時間都相同。如果轉換很花時間,你需要將轉換的結果存到硬碟再用streaming讀取。
不同轉換之間可以串接,例如先作TF-IDF再作LSI。
In [11]:
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
In [12]:
lsi = models.LsiModel(corpus_tfidf, num_topics=200, id2word=dictb)
corpus_lsi = lsi[corpus_tfidf]
In [13]:
lsi.print_topics(5, 8) # 列出前5名的topics
Out[13]:
In [14]:
tfidf.save('model.tfidf')
tfidf = models.TfidfModel.load('model.tfidf')
In [15]:
lsi.save('model.lsi')
lsi = models.LsiModel.load('model.lsi')
是一種接近TF-IDF distance的方法,加上一點隨機成份,無論記憶體或CPU都很有效率。
model = rpmodel.RpModel(tfidf_corpus, num_topics=500)
另一種bag-of-words的計算方法,是LSA(或稱multinomial PCA)的機率版本。
model = ldamodel.LdaModel(bow_corpus, id2word=dictionary, num_topics=100)
non-parametric bayesian method,不需要指定topic數量。
model = hdpmodel.HdpModel(bow_corpus, id2word=dictionary)