from gensim import corpora, models
import jieba.posseg as jp, jieba
# 文本集
texts = [
'美国教练坦言,没输给中国女排,是输给了郎平' * 99,
'美国无缘四强,听听主教练的评价' * 99,
'中国女排晋级世锦赛四强,全面解析主教练郎平的执教艺术' * 99,
'为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了' * 99,
'跑了长途才知道,SUV和轿车之间的差距' * 99,
'家用的轿车买什么好' * 99]
# 分词过滤条件
jieba.add_word('四强', 9, 'n')
flags = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd') # 词性
stopwords = ('没', '就', '知道', '是', '才', '听听', '坦言', '全面', '越来越', '评价', '放弃', '人') # 停词
# 分词
words_ls = []
for text in texts:
words = [w.word for w in jp.cut(text) if w.flag in flags and w.word not in stopwords]
words_ls.append(words)
# 构造词典
dictionary = corpora.Dictionary(words_ls)
# 基于词典,使【词】→【稀疏向量】,并将向量放入列表,形成【稀疏向量集】
corpus = [dictionary.doc2bow(words) for words in words_ls]
# lda模型,num_topics设置主题的个数
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
# 打印所有主题,每个主题显示5个词
for topic in lda.print_topics(num_words=5):
print(topic)
# 主题推断
print(lda.inference(corpus))
体育
):‘0.081*“
郎平” + 0.080*“
中国女排” + 0.077*“
输给” + 0.074*“
主教练”’
汽车
):‘0.099*“
长途” + 0.092*“
SUV” + 0.084*“
跑” + 0.074*“
轿车”’
2
、中国女排→1、郎平→3)
2
, 1,
2
, 3]
2
有
两个,其它只有一个)
2
,
2), (3, 1)]
for e, values in enumerate(lda.inference(corpus)[0]):
print(texts[e])
for ee, value in enumerate(values):
print('\t主题%d推断值%.2f' % (ee, value))
美国教练坦言,没输给中国女排,是输给了郎平
主题0推断值5.29(体育)
主题1推断值0.71
美国无缘四强,听听主教练的评价
主题0推断值4.44(体育)
主题1推断值0.56
中国女排晋级世锦赛四强,全面解析主教练郎平的执教艺术
主题0推断值8.44(体育)
主题1推断值0.56
为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了
主题0推断值0.54
主题1推断值5.46(汽车)
跑了长途才知道,SUV和轿车之间的差距
主题0推断值0.56
主题1推断值5.44(汽车)
家用的轿车买什么好
主题0推断值0.68
主题1推断值3.32(汽车)
text5 = '中国女排将在郎平的率领下向世界女排三大赛的三连冠发起冲击'
bow = dictionary.doc2bow([word.word for word in jp.cut(text5) if word.flag in flags and word.word not in stopwords])
ndarray = lda.inference([bow])[0]
print(text5)
for e, value in enumerate(ndarray[0]):
print('\t主题%d推断值%.2f' % (e, value))
中国女排将在郎平的率领下向世界女排三大赛的三连冠发起冲击
主题0推断值2.40(体育)
主题1推断值0.60
word_id = dictionary.doc2idx(['长途'])[0]
for i in lda.get_term_topics(word_id):
print('【长途】与【主题%d】的关系值:%.2f%%' % (i[0], i[1]*100))
【长途】与【主题0】的关系值:1.61%
【长途】与【主题1】的关系值:7.41%(汽车)
minimum_probability
设置概率阈值)for word, word_id in dictionary.token2id.items():
print(word, lda.get_term_topics(word_id, minimum_probability=1e-8))
print(lda.show_topic(0, 9999))
print('概率总和', sum(i[0] for i in lda.show_topic(0, 9999)))
阅读扩展
jieba中文分词
文本相似度分析
注释
En | Cn |
---|---|
LDA | Latent Dirichlet Allocation |
latent | 潜在的 |
allocation | n. 分配;定位(allocation ) |
inference | n. 推理 |
term | 术语;学期; |
doc2bow | document to bag of words (词袋) |
doc2idx | document to index |