【发布时间】:2021-11-20 11:48:40
【问题描述】:
我有一个包含 2010-2020 年 25 万篇荷兰新闻文章的语料库,我已应用 word2vec 模型来揭示中性词集和维度(例如好坏)之间的关系。由于我的目标也是分析某些主题在一段时间内的流行程度,因此我正在考虑使用 doc2vec 来同时学习单词和文档嵌入。然后可以将文档中主题的“流行度”计算为文档向量和词嵌入(或词向量的组合)之间的余弦相似度。通过这种方式,我可以计算语料库中的年度局部流行率,看看是否有任何变化。可以在here 找到这种方法的一个示例。
我的问题是平均值。每年的余弦相似度会产生非常奇怪的结果。例如,文档向量和与 covid-19/冠状病毒相关的关键字混合之间的余弦相似性表明,自 2016 年以来,局部流行率有所下降(显然情况并非如此)。
我的问题是我所遵循的方法是否真的有效。或者,也许我缺少一些东西。一个250k的文档和100k+的词汇量应该够了吧?
下面是我写的代码:
# Doc2Vec model
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
docs = [TaggedDocument(doc, [i]) for i, doc in enumerate(tokenized_docs)]
d2vmodel = Doc2Vec(docs, min_count = 5, vector_size = 200, window = 10, dm = 1)
docvecs = d2vmodel.docvecs
wordvecs = d2vmodel.wv
# normalize vector
from numpy.linalg import norm
def nrm(x):
return x/norm(x)
# topical prevalence per doc
def topicalprevalence(topic, docvecs, wordvecs):
proj_lst = []
for i in range(0, len(docvecs)):
topic_lst = []
for j in topic:
cossim = nrm(docvecs[i]) @ nrm(wordvecs[j])
topic_lst.append(cossim)
topic_avg = sum(topic_lst) / len(topic_lst)
proj_lst.append(topic_avg)
topicsyrs = {
'topic': proj_lst,
'year': df['datetime'].dt.year
}
return pd.DataFrame(topicsyrs)
# avg topic prevalence per year
def avgtopicyear(topic, docvecs, wordvecs):
docs = topicalprevalence(topic, docvecs, wordvecs)
return pd.DataFrame(docs.groupby("year")["topic"].mean())
# run
covid = ['corona', 'coronapandemie', 'coronacrisis', 'covid', 'pandemie']
covid_scores = topicalprevalence(covid, docvecs, wordvecs)
【问题讨论】:
标签: python gensim word2vec doc2vec