from sklearn.feature_extraction.text import CountVectorizer
import jieba
import time
'''
【程序主要输入参数】
1. n_topics: 主题个数,将文本聚类成几个类别
2. n_iter:迭代次数
【程序主要输出】
1. doc_topic分布:每篇文本对应的topic的概率分布
2. topic-word分布:每个topic内 词的概率分布
'''
'''
用户和节点的topic组及其概率分布,topic内词及其概率分布
对于用户而言:每行文本是用户的微博拼接而成的长文本
对于节点而言:每个文本是节点的所有文本拼接而成的长文本
'''
# topic_num 默认50,即 n_topics 默认50
# n_iter 默认50
def batching(corpus_lines, topic_num=50):
# 原始语料库中的文本
corpus = []
print("corpus_lines")
print(corpus_lines)
for line in corpus_lines:
# 文本切片得到词组
seg_list = jieba.cut(line, cut_all=True)
# 重新将词组拼接成line,其中,每个词之间用" "间隔开。
line = ""
for seg in seg_list:
line = line + " " + str(seg)
# 手动调试位:line
# print(line)
# strip() 方法 参数为空时去除字符串首尾空格
corpus.append(line.strip())
print(corpus)
# CountVectorizer()方法是 sklearn 中的特征数值计算类
# 将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i文本下的词频
vectorizer = CountVectorizer()
print(vectorizer)
try:
# fit_transform() 的输入格式:["小明 小王","阿猫 阿狗 阿强", ... ,"张三"]
frequency_matrix = vectorizer.fit_transform(corpus) # frequency_matrix 词频矩阵
# 正常操作不会出现下边这种ValueError的情况
except ValueError:
# ValueError 出错记录记入 error.log 日志文件
errorlog = open("error.log", "w")
localtime = time.asctime(time.localtime(time.time()))
# 手动调试位:异常日志记录
# print("%s \n ValueError: corpus = %s \n ----------------" %localtime, corpus)
errorlog.write(str(localtime) + " \n ValueError: corpus = " + str(corpus) + "\n ----------------")
# 修正corpus,重新进行词频矩阵构造
corpus = ["错误: 文本内容为空"]
frequency_matrix = vectorizer.fit_transform(corpus) # frequency_matrix 词频矩阵
# analyzer 用于分词,把带有空格的文本依据空格分成词组
# analyze = vectorizer.build_analyzer()
word = vectorizer.get_feature_names() # 返回文本的所有词汇
# 手动调试位:词频矩阵 frequency_matrix
# print(frequency_matrix)
# 单一文本的词频分布
weight = frequency_matrix.toarray()
# LDA
import numpy as np
import lda
model = lda.LDA(n_topics=topic_num, n_iter=50, random_state=1) # 模型的初始化 n_iter 是 迭代次数
model.fit(np.asarray(weight)) # model.fit_transform(X) is also available, 初始化之后只需要调入文本的词频矩阵
# type(doc_topic) ==
doc_topic = model.doc_topic_ # 一行代表一个doc,记录该doc属于每个topic的概率
# type(topic_word) ==
topic_word = model.topic_word_ # 一行代表一个topic, 记录该topic中每个词的概率分布
# word 文本分词集合
# doc_topic.tolist() topic 在某一 doc 中的概率分布
# topic_word.tolist() word 在某一 topic 中的概率分布
# tolist() ndarray --> 多维 list
return word, doc_topic.tolist(), topic_word.tolist()