如何比较短语的相似度?

12

在输入问题时,stackoverflow会向您呈现一个问题列表,这些问题可能涵盖相同的主题。我曾经在其他网站或程序中看到过类似的功能(例如Help文件系统),但我从未自己编写过此类功能。现在我很好奇想知道如何使用什么样的算法来实现这个功能。

我脑海中首先想到的方法是将短语分成单词并查找包含这些单词的短语。在执行此操作之前,您可能希望丢弃不重要的单词(例如“the”、“a”、“does”等),然后您将需要对结果进行排名。

嘿,等等 - 让我们为网页做这件事,然后我们就可以拥有一个什么什么...- 一个“搜索引擎”,然后我们就可以销售广告,然后...

不过,说真的,解决这个问题的常见方法有哪些?

5个回答

12

一种方法是所谓的词袋模型。

正如你猜测的那样,首先计算文本中每个单词出现的次数(在NLP术语中通常称为文档)。然后删除所谓的停用词,如“the”,“a”,“or”等。

剩下的是单词和单词计数。做一段时间后,您会得到一组全面的单词,这些单词出现在您的文档中。然后可以为这些单词创建索引: "aardvark"是1,“apple”是2,...,“z-index”是70092。

现在,您可以将单词包转换为向量。例如,如果您的文档包含两个关于土豚的引用,那么它看起来像这样:

[2 0 0 ... 70k zeroes ... 0].

接着,您可以使用点积计算两个向量之间的“角度”。角度越小,文档越相似。

这只是一个简单版本,还有其他更高级的技术。愿维基百科与您同在


3

3

为了增强词袋思想:

您还可以关注一些 n-gram 的方法,即有序的两个或多个单词字符串。您可能想这样做是因为搜索“空间复杂度”要比搜索包含“空间”和“复杂度”的内容更好,因为这个短语的意义超出了其部分之和;也就是说,如果您得到一个谈论外层空间和宇宙复杂性的结果,那么这可能不是真正意义上的“空间复杂度”。

自然语言处理中的一个关键思想是互信息,它允许您(通过算法)判断一个短语是否真的是一个特定的短语(如“空间复杂度”),还是仅仅是巧合相邻的单词。从数学上讲,主要思想是以概率方式询问这些单词是否经常彼此相邻,超过了仅靠它们的频率猜测的程度。如果您在搜索查询(或索引)中看到一个具有高互信息分数的短语,您可以通过尝试保持这些单词的顺序来获得更好的结果。


2

根据我(相对较少的)开发全文搜索引擎的经验:我会查找包含查询中某些单词的问题(在您的情况下,查询是您的问题)。

当然,应该忽略噪音词,并且我们可能需要检查查询中的“强”词汇,如“ASP.Net”,以缩小搜索范围。常用的反向索引可以用于查找我们感兴趣的单词的问题。

在找到包含查询单词的问题后,我们可能希望计算问题中我们感兴趣的单词之间的距离,以便具有“短语相似性”的问题比具有“讨论相似性,你听到以下短语...”文本的问题排名更高。


0

这里是Python 3中使用tfidfvectorizer的词袋解决方案

#from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
import nltk
nltk.download('stopwords')
s=set(stopwords.words('english'))

train_x_cleaned = []
for i in train_x:
    sentence = filter(lambda w: not w in s,i.split(","))
    train_x_cleaned.append(' '.join(sentence))

vectorizer = TfidfVectorizer(binary=True)
train_x_vectors = vectorizer.fit_transform(train_x_cleaned)

print(vectorizer.get_feature_names_out())
print(train_x_vectors.toarray())

from sklearn import svm

clf_svm = svm.SVC(kernel='linear')
clf_svm.fit(train_x_vectors, train_y)

test_x = vectorizer.transform(["test phrase 1", "test phrase 2", "test phrase 3"])
print (type(test_x))
clf_svm.predict(test_x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接