陌路茶色/

Re-Ranking Words to Improve Interpretability of Automatically Generated Topics

用n个最大概率的词来表示主题,对于人类而言经常是非常难解释的,这篇论文探索主题词的re-ranking工作去生成更容易解释的主题表示。另外一篇对reranking的工作Topic representation: finding more representative words in topic models

Introduction

主题是已定义好的词表的多维度的分布,LDA从主题的潜在变量表示中学习文档的低维度表示。传统上来说,topic被表示为和该主题最大概率的n个词,然而由于噪声或领域特定数据,这些词并不能直观的解释topic,伪共现,高频次出现,低信息量的词可能有很高的概率。

提高主题模型的可解释性是一个重要的研究,包括计算主题的coherence,确定最佳主题个数,标注主题文本/图片,语料预处理等,但是通过re-ranking主题词来提高主题的可解释性还没有被系统的评估过。我们假设有些和特定主题相关的词由于数据稀疏性或低频率对主题而言以一个低概率存在,我们的目标是确定这些词,并重排主题词列表以使它更容易理解。下图(Table 1)展示了代表主题最大概率的前30个词,粗体的单词过于普遍(低信息量,但是有很高的频率),但是存在着词能够表示连贯的主题。比如第二个主题(第二行的词)中和主题相关的词有investment, fund以一个低概率存储,而percent, million这种低信息量的词却以高概率存储,如果取和主题最相关的10个词,investment, fund这些词就不会被包含进主题词中。

屏幕快照 2019-11-04 下午8.20.40.png

本篇论文比较了多种单词ranking的方法,并使用两种方法来评估它们。第一种方法是基于众包任务的,参与者对文档以及一系列的主题列表评判该主题中的词是否是和文档是最相似的,主题列表示通过不同的方法对词排序后的词列表,使用参与者确定主题列表(词列表)中正确主题(词)的占比。第二种方法是基于信息抽取任务的,不依赖于人类评判,使用重排序后的词来提取一系列的文档,重排的效果依赖于这些文档和该词的相关性。

该论文对应的代码在topic_reranking

Background

标准的代表主题的方法是使用和该主题概率最大的前n个词作为主题的表述,然而这些词可能不是该主题最有信息量的词,因此一些列的re-ranking的方法被提出来。

Blei and Lafferty (2009a) 受tf-idf权重思想提出了一种re-ranking的方法,其中包含两种类型的信息:给定主题的对应的单词概率和对应单词在全部主题中的平均概率。其背后的直观解释是一个有代表性的词应该在该主题下有一个高概率而在其他主题下有一个较低概率。Chuang et al. (2012) 联合单词在整个语料中的概率和它的区分度,该区分度使用KL散度计算,对应的两个分布是给定单词的主题分布和主题分布。其他一些被提出的方法仅考虑每个单词在该主题和其他主题的相对概率。Xing and Paul (2018) 提出使用在拟合主题模型时收集的信息,它们利用了Gibbs采样期间生成的后验样本中的主题参数,并根据其可变性对词进行了加权。稳定概率的词相对于高不确定性的词(概率波动比较大)而言更具代表性。

在测量主题质量的上下文中也有对Topic re-ranking的研究,即一个单词重要不仅依赖于在该主题中的概率,而且和语料中相关邻居词相关联,可以通过构造主题明确的图来体现语料中的邻边词的信息,比如PageRank。

Word Re-ranking Methods

使用$\hat \varphi_{w,t}$表示使用主题模型产生的结果中主题$t$下单词$w$的概率。

Original LDA Ranking ($R_{Orig}$)

对于一个主题中排序单词的最常用的方法,该分数生成和该主题最大概率的前n个主题词,记做$R_{Orig}$

Normalised LDA Ranking ($R_{Norm}$)

第一个re-ranking方法是对主题中的词做归一化,分母是该词在所有的主题中对应的概率值,如下表示:
屏幕快照 2019-11-04 下午10.09.30.png
$T$表示模型中主题的个数,该方法根据单词在所有主题中的概率来衡量单词在每个主题下的重要性。

Tf-idf Ranking ($R_{TFIDF}$)

第二种重排序的方法联合单个主题中单词的概率和所有主题中的概率,如下所示:
屏幕快照 2019-11-04 下午10.13.56.png
展开一下:
屏幕快照 2019-11-04 下午10.21.30.png
公式理解为每个主题下的单词的概率加上权重,该权重为该主题下单词概率和所有主题下单词平均概率的差,其实和上面的差不多。

Inverse Document Frequency (IDF) Ranking ($R_{IDF}$)

公式如下:
屏幕快照 2019-11-04 下午10.25.01.png
$D$表示整个文档集合,$D_w$表示包含单词$w$的文档集合,简单的理解为给主题下单词的概率加上权重,而权重为IDF,【这个不能体现出区分度】。

下表显示了两个主题下使用这4中方法分别对应的最大概率主题词,其中具有代表性的词用下划线表示,可以看到加粗的词(没有信息量的词)在其他排序方法中被挤出排序外。
屏幕快照 2019-11-04 下午10.28.27.png

Experiment

这里就不再叙述论文中的第4和第5节内容了,我自己对这些排序方法进行实验。
选取金融,房产,体育,科技,娱乐这5个类别的文章分别100篇,每篇字符长度大于1000(只是测试,所以使结果明显就只取了100篇)。将每篇文章使用关键短语表转换成短语集合,样例如下所示,不能去重(显示的是input_corpus[0]的结果):
屏幕快照 2019-11-05 下午4.12.35.png
使用gensim的lda来训练$R_{Orig}$,使用coherence指标来计算最优主题个数:

x=[]
y=[]
common_dictionary=Dictionary(input_corpus)
common_corpus=[common_dictionary.doc2bow(text) for text in input_corpus]
for i in range(2,21):
    lda = LdaModel(common_corpus,id2word=common_dictionary,random_state=100,alpha='auto',per_word_topics=True, num_topics=i)
    coherence_model_lda = CoherenceModel(model=lda, texts=input_corpus, dictionary=common_dictionary, coherence='c_v')
    coherence_lda = coherence_model_lda.get_coherence()
    x.append(i)
    y.append(coherence_lda)
    
plt.title('Topic-Coherence')
plt.plot(x, y,'b^-', color='green')
plt.legend()
plt.xlabel('topic num')
plt.ylabel('Coherence Score')
plt.show()

如下图所示,最优主题个数是5:
屏幕快照 2019-11-05 下午4.14.07.png

设置lda模型的主题个数为5,训练lda模型,选取每个主题概率最大的前20个词如下所示:
屏幕快照 2019-11-05 下午4.17.20.png
对应的词表大小是22163个,也就是每个词在这5个主题下都会有一个得分,先使用上述中$R_{Norm}$来优化,结果如下:
屏幕快照 2019-11-05 下午4.25.17.png

这个的问题在于有些词在每个主题下的得分可能都非常的小,norm后的结果可能会很大,这样就体现不出来该词的全局信息量,于是有了公式(2),结果如下所示:
屏幕快照 2019-11-05 下午4.46.02.png

论文中对比的实验结果是$R_{TFIDF}$最好,但是看效果似乎体现不出来,总之,主题模型我觉得非常烂,可以对比参考Multi-Dimensional, Phrase-Based Summarization in Text Cubes这篇文章最后做的实验。

部分代码整理如下:

# (0, 1.6260982e-07)
def softmax(prob_list):
    new_prob=[]
    sum=1e-100
    for p in prob_list:
        sum+=math.log(p[1])
    avg=sum/(len(prob_list)*1.0)
    for i in range(len(prob_list)):
        new_prob.append([prob_list[i][0],prob_list[i][12]*(math.log(prob_list[i][13])-avg)])
    return new_prob

#norm
topic_probability=np.array([[0.0]*len(common_dictionary.keys())]*num_topics)
for w in common_dictionary.keys():
    prob=lda.get_term_topics(w,1e-100)
    new_prob=softmax(prob)
    for p in new_prob:
        topic_probability[p[0]][w]=p[1]
print('----norm over----')

#sort
for i in range(len(topic_probability)):
    temp=[(j,topic_probability[i][j]) for j in range(len(topic_probability[i]))]
    topic_probability[i]=[tup[0] for tup in sorted(temp,key=lambda x:x[1],reverse=True)]

print('----sort over----')
print(list(topic_probability[0][:100]))

#topN
topN=20
#print
for i in range(len(topic_probability)):
    temp=[common_dictionary.id2token[w] for w in topic_probability[i][:topN]]
    print('------topic '+str(i)+'------')
    print(temp)

LDAvis

顺带将LDAvis这个工具讲解一下,主要参考LDAvis: A method for visualizing and interpreting topicsTermite: Visualization Techniques for Assessing Textual Topic Models这两篇论文对应的两个指标,先截个图如下:
屏幕快照 2019-11-05 下午6.16.43.png
左边部分表示主题分布图,可以直观看到主题1和主题4比较相近(重叠了),右边部分表示对应主题最相关的topN个词,通过$\lambda$调节,$\lambda$越小,越看重词和主题的相关性。这里选取的是上述5个主题中的第三个主题对应的term排序结果,在参考部分给出了该工具的使用案例。该工具中提到了两个指标,在上图的右下角,这里详细解释一下。

Relevance

论文中给出的公式如下所示:
屏幕快照 2019-11-05 下午9.48.22.png
其中$\phi_{kw}$就是lda模型的结果中主题k对应的w的概率 (每个主题对应单词的概率和为1),对应前面所述$R_{Orig}$,而$p_w$则为单词在全部主题中概率的和,将其用上述参数表示为:
屏幕快照 2019-11-05 下午10.00.21.png
这个比较好理解吧,左边是主题t下的概率(主题内部词的重要性),右边是主题间的概率(词在各个主题下的占比),如果$\lambda$等于0,表明更看重主题间的概率而忽略主题内的概率。

Saliency

论文中给出的公式为:
屏幕快照 2019-11-05 下午10.04.25.png
屏幕快照 2019-11-05 下午10.04.38.png
其中$P(T|w)$表示在观测到w被主题T生成的概率,即看到词w了,w是主题T生成的概率为$P(T|w)$,
上面的distinctiveness使用的是KL散度,其中$P(T)$为理论分布,$P(T|w)$为真实分布,$P(T|w)$分布和$P(T)$分布越相似,该值越接近于0。直观理解是在看到w后,$P(T|w)$的值和$P(T)$的值越不相似,说明w的作用越大,也就是越有区分度,那么distinctiveness值就会越大。

疑问

关于最后的Saliency,$P(T|w)=\frac{P(w|T)P(T)}{P(w)}$,但是$P(T)$该如何计算呢?

解决了,参考LDA训练过程,在Topic representation: finding more representative words in topic models讲到了

参考

[1] Topic Modeling with Gensim

留下一条评论

暂无评论