计算文本字符串相似度的方法?

时间:2016-10-18 17:11:40

标签: nlp n-gram linguistics

假设我有一个字符串数组,我需要将它们分类成簇。我目前正在使用n-gram进行分析,例如:

群集1:

  • 管道固定
    • 拉斯维加斯的管道固定
    • 关于管道固定的电影

群集2:

  • 古典音乐
    • 为什么古典音乐很棒
    • 什么是古典音乐

让我们说在这个数组中我有这两个文本字符串(其中包括):

  • 日本学生
  • 来自日本的学生

现在,N-gram方法显然不会将这两个字符串放在一起,因为它们不共享相同的标记化结构。我尝试使用Damerau-Levenshtein距离计算和TF / IDF,但都抓住了太多的外部噪音。我可以使用哪些其他技术来理解这两个字符串属于单个集群?

2 个答案:

答案 0 :(得分:3)

你可以使用短语的简单词袋表示,同时取出unigrams和bigrams(可能在词干之后)并将它们放入特征向量中,然后使用例如余弦来测量向量之间的相似性。请参阅herehere。这适用于较长的文档,但它可能适用于您的目的。

更复杂的技术是从文档语料库中训练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的