emmm..这个系列可能会有好几篇文章吧,用来弥补对黑色九月的无知..(4)
Guan R, Zhang H, Liang Y, et al. Deep feature-based text clustering and its explanation[J]. IEEE Transactions on Knowledge and Data Engineering, 2020.
摘要导读
现有的大多数文本聚类算法都基于词袋模型,该模型面临高维和稀疏性问题,且忽略了文本结构和序列信息。基于深度学习的模型,如卷积神经网络和递归神经网络,将文本视为序列,但缺乏监督信号和可解释的结果。本文提出了一个基于特征的深度文本聚类(Deep Feature-Based Text Clustering, DFTC)框架,该框架将预训练的文本编码器合并到文本聚类任务中。该模型基于序列表示,打破了对监督的依赖性。除此之外,该框架还添加了一个聚类结果的解释模块。从而可以通过对聚类结果的解释来理解深度学习方法的原理。
模型框架浅析
该框架从左到右依次是:原始文本-->文本特征提取模块-->文本聚类模块-->聚类结果解释模块。
- 文本特征提取模块
不同于BERT+Clustering的模型,本文在特征提取模块中采用了两种深度特征抽取器:Neural Language Model和InferSent。
(1)Neural Language Model
语言模型的目标是从大型未标记语料库中估计单词序列的概率函数。给定包含个单词的文本序列
,整个序列的概率可以写成:
其中
表示给定当前序列的情况下生成
的概率。然而,由于LSTM的梯度不稳定问题,后向语言模型可以补充正向语言模型忽略的补充信息。其形式如下:
通过结合前后向的隐含状态的表示,可以得到-th的文本表示为
,
,其中
是LSTM的cell function,
是
时刻对应的文本输入。
是与前向对应的后向语言模型的文本表示。将二者进行拼接得到了最终的
时刻的文本表示
。
由于句子或文档长度的可变性,无法直接将每个句子的上下文特征输入到后续模块。因此,必须将上下文特征融合到一个固定大小的特征向量中。这里介绍了3种策略:
对于给定个token的序列,每个token表示为一个
维的向量,
a) Max-pooling:其中第维的计算方式为
b) Mean-pooling:第维的计算方式为
c) Last-time context feature vector:分别将前向和后向两个语言模型的最后时刻的特征表示拼接作为完整的文本表示结果
(2)与在未标记语料库上训练的神经语言模型相反,InferSent以监督方式在标记的自然语言推理(NLI)语料库上进行训练。给定输入的文本,InferSent会直接根据预训练好的模型给出具有意义的句子Embedding的结果。感兴趣的读者请移步原始论文,这里不进行赘述。 - 文本正则化
得到的输出将会被输入到特征的正则化模块(用于保证稳定的性能),正则化模块包含了3种不同的策略:
(1)Identity normalization:恒等正则,。
(2)standard normalization:标准化,。
(3)Layer normalization:层正则,,
和
分别是特征表示
的均值和标准差。
- 文本聚类
这里作者仅使用了k-means进行聚类。 - 聚类结果解释模型
由于文本聚类算法的无监督性质,我们无法直接了解每个聚类的含义。文本聚类算法最常见的解释方法是计算每个类簇的词频分布,并使用类簇中最频繁的词来表示该聚类的语义。这种传统的词频解释模型被称为FREQ模型。然而,这个模型的问题是,高频词往往在几个类簇中是常见的。例如,当对一个新闻语料库进行聚类时,"said "将是每个类簇中频率最高的词之一。此外,这种较为简单的方法也会引入噪音。
为了解决这两个问题,本文引入了一个新的模型TCRE,以自适应地调整类簇中的每个单词的权重。算法对应的伪代码如下:
`输入`:语料库Corpus,前序模型得到的聚类标签clusterResult
`输出`:每个类簇所包含的指示词列表indWordsList
1. 设n=size(Corpus)
2. 初始化 featList=[]
3. #将文本映射为0-1词袋特征向量
4. for i in [1,n] do
5. 将当前文本Corpus[i]切分为token
6. 过滤掉停用词和低频词
7. 将剩余的token映射为0-1 特征向量feat
8. 将当前的feat添加到featList中
9. end for
10. #获取每个类簇的指示词
11. 在数据集(featList, clusterResult)上训练逻辑回归分类器lgClassifier
12. #weightList是权重列表,其长度为标签数目一致
13. 令weightList=lgClassifier:weights
14. 初始化indWordsList=[]
15. for weight in weightList do #遍历权重列表
16. 初始化tmpWeight=[] #初始化当前类簇的权重列表
17. for w in weight do # 遍历当前类簇中每个词的权重
18. 将abs(w)添加到tmpWeight
19. end for
20. 令tmpIdx=argsort(tmpWeight)[:n] #对当前类簇中各词的权重进行排序,并得到对应的索引,选取前n个指示词索引
21. 完成索引tmpIdx和指示词indWords之间的对应
22. 将indWords添加到indWordsList
23. end for
24. return indWordsList
关于深度模型在feature-based分支上的应用。
发在TKDE上的大佬。












网友评论