假设我有一个字符串数组,我需要将它们分类成簇。我目前正在使用n-gram进行分析,例如:
群集1:
群集2:
等
让我们说在这个数组中我有这两个文本字符串(其中包括):
现在,N-gram方法显然不会将这两个字符串放在一起,因为它们不共享相同的标记化结构。我尝试使用Damerau-Levenshtein距离计算和TF / IDF,但都抓住了太多的外部噪音。我可以使用哪些其他技术来理解这两个字符串属于单个集群?
答案 0 :(得分:3)
你可以使用短语的简单词袋表示,同时取出unigrams和bigrams(可能在词干之后)并将它们放入特征向量中,然后使用例如余弦来测量向量之间的相似性。请参阅here或here。这适用于较长的文档,但它可能适用于您的目的。
更复杂的技术是从文档语料库中训练distributed bag-of-words model,然后使用它来查找文档对中的相似性。
[编辑]
您也可以使用word2vec来使用分布式BoW模型。例如,在Python中使用gensim库和预先训练的word2vec Google News model:
from gensim.models import word2vec
model = word2vec.Word2Vec.load_word2vec_format('GoogleNews-vectors-negative300.bin.gz', binary=True)
print model.n_similarity(['students', 'Japan'], ['Japanese', 'students'])
输出:
0.8718219720170907
答案 1 :(得分:1)
您有规范化问题。字符串等效驱动您的匹配算法,“日本”和“日语”不是字符串等效。几个选项:
1)将标记标准化为根形式,以便将“日语”标准化为“日本”或类似的东西。规范化伴随着一些问题,比如在谈论“史蒂夫·乔布斯”时,你不希望“工作”被标准化为“工作”。 Porter stemmer,其他形态学工具等可以帮助解决这个问题。
2)使用字符n-gram表示字符串等值。如果你做了3-5克,那么两个句子都会出现“日本”的情况。我是分类的忠实粉丝,不太确定聚类。
3)使用潜在技术帮助像Latent Dirichelet Allocation这样的集群。粗略地说,您通过与“东京”等词语强烈关联的其他字符串等效词将“日本”与“日语”联系起来。
Breck的