English 中文(简体)
如何比较短语的相似性?
原标题:
  • 时间:2008-09-16 09:04:44
  •  标签:

输入问题时,stackoverflow会向您提供一份问题列表,它认为这些问题可能涉及同一主题。我在其他网站或其他程序中也看到过类似的功能(例如帮助文件系统),但我自己从未编程过这样的东西。现在我很想知道人们会用什么样的算法来实现这一点。

我想到的第一种方法是将短语分成单词,并寻找包含这些单词的短语。在你这样做之前,你可能想扔掉无关紧要的单词(比如the、a、do等),然后你会想对结果进行排名。

嘿,等等,让我们对网页这样做,然后我们可以有一个。。。手表手表…-一个“搜索引擎”,然后我们可以销售广告,然后。。。

不,说真的,解决这个问题的常用方法是什么?

最佳回答

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

正如您所猜测的,首先您计算单词在文本中出现的次数(在NLP行话中通常称为文档)。然后你抛出所谓的停止词,比如“the”、“a”、“or”等等。

You re left with words and word counts. Do this for a while and you get a comprehensive set of words that appear in your documents. You can then create an index for these words: "aardvark" is 1, "apple" is 2, ..., "z-index" is 70092.

现在你可以把你的单词袋变成向量了。例如,如果您的文档包含两个关于土豚的引用,而没有其他内容,那么它看起来是这样的:

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

之后,您可以使用点积。角度越小,文档越近。

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

问题回答

@Hanno你应该试试Levenstein距离算法。给定输入字符串s和字符串列表t,对t中的每个字符串u进行迭代,并返回具有最小Levenstein距离的字符串。

http://en.wikipedia.org/wiki/Levenshtein_distance

请参阅http://www.javalobby.org/java/forums/t15908.html

为了增加单词袋的意思:

有几种方法也可以让你注意n-gram,即由两个或多个单词组成的字符串。你可能想这样做,因为搜索“空间复杂性”远不止搜索包含“空间”和“复杂性”的东西,因为这个短语的含义不仅仅是其各部分的总和;也就是说,如果你得到一个关于外太空和宇宙复杂性的结果,这可能不是搜索“太空复杂性”的真正含义。

自然语言处理的一个关键思想是相互信息,它允许您(从算法上)判断一个短语是否真的是一个特定的短语(例如“空间复杂性”)或者只是巧合地相邻的单词。从数学上讲,主要的想法是问,如果这些单词出现在一起的频率比你单独根据它们的频率猜到的要高。如果你在搜索查询中(或在索引时)看到一个相互信息得分很高的短语,你可以通过尝试按顺序排列这些单词来获得更好的结果。

From my (rather small) experience developing full-text search engines: I would look up questions which contain some words from query (in your case, query is your question). Sure, noise words should be ignored and we might want to check query for strong words like ASP.Net to narrow down search scope. http://en.wikipedia.org/wiki/Index_(search_engine)#Inverted_indices >Inverted indexes are commonly used to find questions with words we are interested in.

在从查询中找到单词的问题后,我们可能想计算我们对问题感兴趣的单词之间的距离,所以短语相似性问题文本的排名高于讨论相似性问题,你会听到以下短语。。。文本

这是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)




相关问题
热门标签