如此反复,当各个概率分布不再发生变化时,即完成了收敛和训练过程
训练思想仍然是EM算法(摁住一个,去计算另一个)
对比K-means
实际工程过程中:
每一个主题对每一个词都有一个基本出现次数(人工设定)
每一篇文章在各个主题上都有一个基本出现词数
步骤:
新来一片文章,需要确定它的主题分布:
先随机化主题分布
1.根据主题分布和主题-单词模型,找寻每个
单词所对应的主题
2.根据单词主题重新确定主题分布
1,2反复,直到主题分布稳定 最终得到两个模型:
1.每篇文章的主题分布
2.每个主题产生词的概率
用途:
1.根据文章的主题分布,计算文章之间的相似性
2.计算各个词语之间的相似度
四、代码
# -*- coding: utf-8 -*-
import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
for i in range(4):
with open('./data/nlp_test%d.txt' % i, encoding='UTF-8') as f:
document = f.read()
document_cut = jieba.cut(document)
result = ' '.join(document_cut)
print(result)
with open('./data/nlp_test%d.txt' % (i+10), 'w', encoding='UTF-8') as f2:
f2.write(result)
f.close()
f2.close()
# 从文件导入停用词表
stpwrdpath = "./data/stop_words.txt"
stpwrd_dic = open(stpwrdpath, 'r', encoding='UTF-8')
stpwrd_content = stpwrd_dic.read()
# 将停用词表转换为list
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()
print(stpwrdlst)
# 向量化 不需要tf_idf
corpus = []
for i in range(4):
with open('./data/nlp_test%d.txt' % (i+10), 'r', encoding='UTF-8') as f:
res = f.read()
corpus.append(res)
print(res)
cntVector = CountVectorizer(stop_words=stpwrdlst)
cntTf = cntVector.fit_transform(corpus)
print(cntTf)
# 打印输出对应关系
# 获取词袋模型中的所有词
wordlist = cntVector.get_feature_names()
# 元素a[i][j]表示j词在i类文本中的权重
weightlist = cntTf.toarray()
# 打印每类文本的词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weightlist)):
print("-------第", i, "段文本的词语权重------")
for j in range(len(wordlist)):
print(wordlist[j], weightlist[i][j])
lda = LatentDirichletAllocation(n_components=3,#3个话题
learning_method='batch',
random_state=0)
docres = lda.fit_transform(cntTf)
print("文章的主题分布如下:")
print(docres)
print("主题的词分布如下:")
print(lda.components_)
优质内容筛选与推荐>>
1、(轉貼) C++/CLI Language Specification (ECMA-372) (.NET) (C++/CLI) (C/C++)2、python中使用redis模块, 设置过期时间3、qt5 模态对话框设置4、[ HNOI 2005 ] 狡猾的商人5、关于Linq查询where条件可能为null时的诡异事件