LDA gensim实现,两个不同文档之间的距离
编辑:我发现这里有一个有趣的问题。 该链接显示gensim在训练和推理步骤中都使用随机性。 所以它在这里建议的是设置一个固定的种子,以便每次获得相同的结果。 为什么我要为每个主题获取相同的概率?
我想要做的是为每个推特用户找到她的主题,并根据主题的相似性计算推特用户之间的相似度。 是否有可能为gensim中的每个用户计算相同的主题,或者是否必须计算主题词典并聚集每个用户主题?
总的来说,在gensim中基于主题模型提取来比较两个Twitter用户的最佳方法是什么? 我的代码如下:
def preprocess(id): #Returns user word list (or list of user tweet)
user_list = user_corpus(id, 'user_'+str(id)+'.txt')
documents = []
for line in open('user_'+str(id)+'.txt'):
documents.append(line)
#remove stop words
lines = [line.rstrip() for line in open('stoplist.txt')]
stoplist= set(lines)
texts = [[word for word in document.lower().split() if word not in stoplist]
for document in documents]
# remove words that appear only once
all_tokens = sum(texts, [])
tokens_once = set(word for word in set(all_tokens) if all_tokens.count(word) < 3)
texts = [[word for word in text if word not in tokens_once]
for text in texts]
words = []
for text in texts:
for word in text:
words.append(word)
return words
words1 = preprocess(14937173)
words2 = preprocess(15386966)
#Load the trained model
lda = ldamodel.LdaModel.load('tmp/fashion1.lda')
dictionary = corpora.Dictionary.load('tmp/fashion1.dict') #Load the trained dict
corpus = [dictionary.doc2bow(words1)]
tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]
corpus_lda = lda[corpus_tfidf]
list1 = []
for item in corpus_lda:
list1.append(item)
print lda.show_topic(0)
corpus2 = [dictionary.doc2bow(words2)]
tfidf2 = models.TfidfModel(corpus2)
corpus_tfidf2 = tfidf2[corpus2]
corpus_lda2 = lda[corpus_tfidf2]
list2 = []
for it in corpus_lda2:
list2.append(it)
print corpus_lda.show_topic(0)
返回用户语料库的主题概率(将用户词语列表用作语料库时):
[(0, 0.10000000000000002), (1, 0.10000000000000002), (2, 0.10000000000000002),
(3, 0.10000000000000002), (4, 0.10000000000000002), (5, 0.10000000000000002),
(6, 0.10000000000000002), (7, 0.10000000000000002), (8, 0.10000000000000002),
(9, 0.10000000000000002)]
在我使用用户推文列表的情况下,我得到每个推文的计算主题。
问题2:以下是否有意义:用几个Twitter用户训练LDA模型,并使用之前计算的LDA模型为每个用户(每个用户语料库)计算主题?
在提供的例子中, list[0]
返回等概率0.1的主题分布。 基本上,每行文本都对应不同的推文。 如果我使用corpus = [dictionary.doc2bow(text) for text in texts]
来计算语料库,它会分别给出每条推文的概率。 另一方面,如果我像例子一样使用corpus = [dictionary.doc2bow(words)]
,我将所有的用户词作为语料库。 在第二种情况下,gensim为所有主题返回相同的概率。 因此,对于这两个用户,我获得相同的主题分布。
用户文本语料库应该是单词列表还是句子列表(推文列表)?
关于在第264页的twitterRank方法中Qi He和Jianshu Weng的实现,它说:我们将由个人推特员发布的推文汇总成一个大文档。 因此,每个文档对应于一个推特者。 好吧,我很困惑,如果文档将所有用户推文那么该文集应该包含什么?
Fere Res在这里检查以下建议。 首先,您必须从所有用户计算lda模型,然后使用提取的未知文档的向量,这是在这里计算的
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lda = lda[vec_bow]
如果您打印以下内容: print(vec_lda)
您将看到将未见文档分发给lda模型主题。
根据官方文件,Latent Dirichlet Allocation,LDA是一个从袋式计数转换为低维主题空间的转换。
您可以在TFIDF的顶部使用LSI,但不能使用LDA。 如果您在LDA上使用TFIDF,那么它会生成每个主题几乎相同的,您可以打印并检查它。
另请参阅https://radimrehurek.com/gensim/tut2.html。
链接地址: http://www.djcxy.com/p/21279.html上一篇: LDA gensim implementation, distance between two different docs
下一篇: html5