Python 为语料库中的每个文档指定主题(LDA)

Python 为语料库中的每个文档指定主题(LDA),python,pandas,lda,Python,Pandas,Lda,我试图计算一个文档属于LDA模型找到的每个主题的概率。我已经成功地制作了LDA,但现在我被卡住了。我的代码如下: ## Libraries to download from nltk.tokenize import RegexpTokenizer from nltk.corpus import stopwords from nltk.stem.porter import PorterStemmer from gensim import corpora, models import gensim

我试图计算一个文档属于LDA模型找到的每个主题的概率。我已经成功地制作了LDA,但现在我被卡住了。我的代码如下:

## Libraries to download
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from gensim import corpora, models
import gensim

## Tokenizing
tokenizer = RegexpTokenizer(r'\w+')

# create English stop words list
en_stop = stopwords.words('english')

# Create p_stemmer of class PorterStemmer
p_stemmer = PorterStemmer()

import json
import nltk
import re
import pandas

appended_data = []
for i in range(2005,2016):
    if i > 2013:
        df0 = pandas.DataFrame([json.loads(l) for l in open('SDM_%d.json' % i)])
        appended_data.append(df0)
    df1 = pandas.DataFrame([json.loads(l) for l in open('Scot_%d.json' % i)])
    df2 = pandas.DataFrame([json.loads(l) for l in open('APJ_%d.json' % i)])
    df3 = pandas.DataFrame([json.loads(l) for l in open('TH500_%d.json' % i)])
    df4 = pandas.DataFrame([json.loads(l) for l in open('DRSM_%d.json' % i)])
    appended_data.append(df1)
    appended_data.append(df2)
    appended_data.append(df3)
    appended_data.append(df4)

appended_data = pandas.concat(appended_data)
doc_set = appended_data.body

# list for tokenized documents in loop
texts = []

# loop through document list
for i in doc_set:

    # clean and tokenize document string
    raw = i.lower()
    tokens = tokenizer.tokenize(raw)

    # remove stop words from tokens
    stopped_tokens = [i for i in tokens if not i in en_stop]

    # add tokens to list
    texts.append(stopped_tokens)

# turn our tokenized documents into a id <-> term dictionary
dictionary = corpora.Dictionary(texts)

# convert tokenized documents into a document-term matrix
corpus = [dictionary.doc2bow(text) for text in texts]

# generate LDA model
ldamodel = gensim.models.ldamodel.LdaModel(corpus, num_topics=15, id2word = dictionary, passes=50)

它似乎有效,因为它检索属于主题1的文章。然而,有人能解释一下背后的直觉是什么,以及是否还有其他选择。例如,这里阈值水平背后的直觉是什么?谢谢

我希望您已经在其他地方阅读过,阈值是一个特定于应用程序的设置,取决于您希望分类模型的范围。1/k(对于k类)的基本原理是经验性的:它是大多数分类任务的起点(即,它产生明显有用的结果)

直觉层面的理由很简单:如果一个文档与一个主题的匹配程度足够强,足以使随机聚类的可能性大打折扣,那么它很可能是一个积极的识别。当然,一旦获得第一个结果,就必须调整“可能”

最值得注意的是,您希望观察一两个“嘈杂”的集群,这些集群中的主题只是松散相关的:集群的标准偏差比大多数集群都大。一些应用程序计算主题的Z分数,并为每个主题设置基于Z的阈值。其他人对给定集群中的所有主题都有一个通用阈值

您的最终解决方案取决于您所需的匹配强度(较低的阈值)、主题变化(特定主题的阈值)、所需的准确性(假阳性和假阴性的成本是多少?)以及所需的培训和评分速度


这是否足以帮助你前进?

“我觉得很困惑”并不能真正描述问题;它让我们不得不编写文档分类的一个阶段的教程,这超出了StackOverflow的范围。如果你能详细了解你在哪里迷路,也许有人能帮你度过难关。完全正确,我更新了这个问题,使它更具体。干杯好工作;接近票数的投票被撤回。谢谢非常感谢@Prune!另一个问题@Prune,你知道如何计算每个主题在整个语料库中的权重/百分比吗?很抱歉给您带来不便。这取决于您的意思。我怀疑你想要的是[主题出现的论文数量]/[语料库中的论文总数]。是的,就是这样,我想你描述它的方式就是找到它的方法。我想可能已经有一个命令计算了语料库中每个主题的百分比。干杯,再次感谢!啊。。。很抱歉我对熊猫的设施不太熟悉。我的经验是使用Trusted Analytics Platform,工具包(ATK)返回权重,作为语料库LDA建模的一部分。我怀疑安装TAP的开销是否值得为您的应用程序而费心。
# Assinging the topics to the document in corpus
lda_corpus = ldamodel[corpus]

# Find the threshold, let's set the threshold to be 1/#clusters,
# To prove that the threshold is sane, we average the sum of all probabilities:
scores = list(chain(*[[score for topic_id,score in topic] \
                     for topic in [doc for doc in lda_corpus]]))

threshold = sum(scores)/len(scores)
print(threshold)

cluster1 = [j for i,j in zip(lda_corpus,doc_set) if i[0][1] > threshold]

print(cluster1)