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