Gensim LDA 中的主题明智文档分布
Topic wise document distribution in Gensim LDA
python 中有没有一种方法可以映射属于特定主题的文档。例如,主要是“主题 0”的文档列表。我知道有多种方法可以列出每个文档的主题,但我该怎么做呢?
编辑:
我正在为 LDA 使用以下脚本:
doc_set = []
for file in files:
newpath = (os.path.join(my_path, file))
newpath1 = textract.process(newpath)
newpath2 = newpath1.decode("utf-8")
doc_set.append(newpath2)
texts = []
for i in doc_set:
raw = i.lower()
tokens = tokenizer.tokenize(raw)
stopped_tokens = [i for i in tokens if not i in stopwords.words()]
stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
texts.append(stemmed_tokens)
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=2, random_state=0, id2word = dictionary, passes=1)
你有一个 tool/API (Gensim LDA),当给定一个文档时,它会为你提供一个主题列表。
但您想要相反的结果:一个主题的文档列表。
基本上,您需要自己构建 reverse-mapping。
幸运的是,Python 用于处理映射的本机字典和习惯用法使这非常简单 - 只需几行代码 - 只要您使用的数据完全适合内存。
非常粗略的方法是:
- 创建新结构(
dict
或 list
)以将主题映射到 lists-of-documents
- 遍历所有文档,将它们(可能带有分数)添加到 topic-to-docs 映射
- 最后,针对每个感兴趣的主题查找(或许排序)那些 lists-of-docs
如果可以编辑您的问题以包含有关 documents/topics 的 format/IDs 以及您如何训练 LDA 模型的更多信息,则可以使用更具体的示例代码扩展此答案构建您需要的那种 reverse-mapping。
更新您的代码更新:
好的,如果您的模型在 ldamodel
中,而您的 BOW-formatted 文档在 corpus
中,您可以这样做:
# setup: get the model's topics in their native ordering...
all_topics = ldamodel.print_topics()
# ...then create a empty list per topic to collect the docs:
docs_per_topic = [[] for _ in all_topics]
# now, for every doc...
for doc_id, doc_bow in enumerate(corpus):
# ...get its topics...
doc_topics = ldamodel.get_document_topics(doc_bow)
# ...& for each of its topics...
for topic_id, score in doc_topics:
# ...add the doc_id & its score to the topic's doc list
docs_per_topic[topic_id].append((doc_id, score))
在此之后,您可以看到某个主题的所有 (doc_id, score)
值的列表,如下所示(对于主题 0):
print(docs_per_topic[0])
如果您对每个主题的热门文档感兴趣,您可以进一步按得分对每个列表的对进行排序:
for doc_list in docs_per_topic:
doc_list.sort(key=lambda id_and_score: id_and_score[1], reverse=True)
然后,您可以获得主题 0 的前 10 个文档,例如:
print(docs_per_topic[0][:10])
请注意,这一切都使用 all-in-memory 列表,这对于 very-large 语料库可能变得不切实际。在某些情况下,您可能需要将 per-topic 清单编译成 disk-backed 结构,例如文件或数据库。
python 中有没有一种方法可以映射属于特定主题的文档。例如,主要是“主题 0”的文档列表。我知道有多种方法可以列出每个文档的主题,但我该怎么做呢?
编辑:
我正在为 LDA 使用以下脚本:
doc_set = []
for file in files:
newpath = (os.path.join(my_path, file))
newpath1 = textract.process(newpath)
newpath2 = newpath1.decode("utf-8")
doc_set.append(newpath2)
texts = []
for i in doc_set:
raw = i.lower()
tokens = tokenizer.tokenize(raw)
stopped_tokens = [i for i in tokens if not i in stopwords.words()]
stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
texts.append(stemmed_tokens)
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=2, random_state=0, id2word = dictionary, passes=1)
你有一个 tool/API (Gensim LDA),当给定一个文档时,它会为你提供一个主题列表。
但您想要相反的结果:一个主题的文档列表。
基本上,您需要自己构建 reverse-mapping。
幸运的是,Python 用于处理映射的本机字典和习惯用法使这非常简单 - 只需几行代码 - 只要您使用的数据完全适合内存。
非常粗略的方法是:
- 创建新结构(
dict
或list
)以将主题映射到 lists-of-documents - 遍历所有文档,将它们(可能带有分数)添加到 topic-to-docs 映射
- 最后,针对每个感兴趣的主题查找(或许排序)那些 lists-of-docs
如果可以编辑您的问题以包含有关 documents/topics 的 format/IDs 以及您如何训练 LDA 模型的更多信息,则可以使用更具体的示例代码扩展此答案构建您需要的那种 reverse-mapping。
更新您的代码更新:
好的,如果您的模型在 ldamodel
中,而您的 BOW-formatted 文档在 corpus
中,您可以这样做:
# setup: get the model's topics in their native ordering...
all_topics = ldamodel.print_topics()
# ...then create a empty list per topic to collect the docs:
docs_per_topic = [[] for _ in all_topics]
# now, for every doc...
for doc_id, doc_bow in enumerate(corpus):
# ...get its topics...
doc_topics = ldamodel.get_document_topics(doc_bow)
# ...& for each of its topics...
for topic_id, score in doc_topics:
# ...add the doc_id & its score to the topic's doc list
docs_per_topic[topic_id].append((doc_id, score))
在此之后,您可以看到某个主题的所有 (doc_id, score)
值的列表,如下所示(对于主题 0):
print(docs_per_topic[0])
如果您对每个主题的热门文档感兴趣,您可以进一步按得分对每个列表的对进行排序:
for doc_list in docs_per_topic:
doc_list.sort(key=lambda id_and_score: id_and_score[1], reverse=True)
然后,您可以获得主题 0 的前 10 个文档,例如:
print(docs_per_topic[0][:10])
请注意,这一切都使用 all-in-memory 列表,这对于 very-large 语料库可能变得不切实际。在某些情况下,您可能需要将 per-topic 清单编译成 disk-backed 结构,例如文件或数据库。