我的主题是(一堆)文本的相似性和聚类。简而言之:我想将收集的文本聚集在一起,它们应该出现在最后有意义的集群中。为此,我到目前为止的方法如下,我的问题在于集群。目前的软件是用php编写的。
1) 相似性:我将每个文档视为“词袋”并将词转换为向量。我用
- 过滤(仅“真实”单词)
- 标记化(将句子分成单词)
- 词干提取(将单词简化为基本形式;波特词干分析器)
- 修剪(剪切频率过高和过低的单词)
作为降维的方法。之后,我使用余弦相似度(如网络上各种网站和此处所建议/描述的那样) 。
结果是这样的相似矩阵:
A B C D E
A 0 30 51 75 80
B X 0 21 55 70
C X X 0 25 10
D X X X 0 15
E X X X X 0
A…E 是我的文本,数字是百分比相似度;越高,文本越相似。因为 sim(A,B) == sim(B,A) 只填充了一半的矩阵。所以文本 A 与文本 D 的相似度为 71%。
我现在想从这个矩阵中生成一个先验未知(!)个簇。集群应该一起代表相似的项目(直到某个停止标准)。
我自己尝试了一个基本的实现,基本上是这样的(60%作为固定相似度阈值)
foreach article
get similar entries where sim > 60
foreach similar entry
check if one of the entries already has a cluster number
if no: assign new cluster number to all similar entries
if yes: use that number
它起作用了(不知何故),但一点都不好,结果往往是怪物群。所以,我想重做这个,并且已经研究了各种聚类算法,但我仍然不确定哪一个效果最好。我觉得应该是凝聚算法,因为每一对文本一开始都可以看成一个簇。但问题仍然是停止标准是什么,以及算法是否应该将现有集群划分和/或合并在一起。
对不起,如果有些东西看起来很基础,但我在这个领域相对较新。谢谢您的帮助。