转载请注明出处
简单了解了下目前的一些聚类算法,
目前了解的太少了,后面再进一步调研吧 /(ㄒoㄒ)/~~
然后当时就自己拍脑袋写了个基于词语相似度的聚类算法,主要一开始的时候,需求跟聚类还不太一样,类似于词语相似度,扩充词典那样,后来需求变啊变,就变成聚类了,索性就改吧改吧代码,拍出来一个算法
原理
1. 词与词之间相似度计算,可以用word2vec、fasttext词向量、词林相似度等等等等
2. 初始化,可以有少量已知的类别词语,也可以冷启动
3. 聚类方法,采用计算词语和类中词语平均相似度,根据阈值进行判断是否加入到当前类中,否则添加新的类别
步骤:
- 获取需要聚类的文本/词语对应的向量,如果采用word2vec,对于短语或句子,则取切词后词语的向量均值作为其向量,采用fasttext,则直接用句子向量
- 初始化类别为空,第一个文本放到第一个类别
- 对剩余文本进行聚类,判断与其对应的向量余弦相似度最近的类别(类别向量取类别中句子向量的平均值表示),如果相似度大于阈值,则加入此类别,否则当前文本作为新的类别。
- 所有单一文本为一个类别的数据为此次聚类的未成功聚类文本
这种自举的算法虽然不能对所有文本进行聚合,但是能保证成功聚类的点的准确率,简单说,使得聚类的结果中类别内数据更干净。
另外发现,对于一些词语或短句效果有时候能达到意想不到的效果。使用的过程中,可以根据结果,进行相应的数据清洗,例如将一些无关的前后缀或短句中的聚类无关词语去除掉。 举个栗子,比如我聚类得到的一个类别,很多都是 “XX报道”,但是我其实更想将具体的相同的报道内容聚类到一起,那就直接把“报道”去掉就好了。那如果只是想单纯把“报道”相关和“刊物”相关区分&#x