获取最接近的字符串匹配(字符串大小可能非常不同)

时间:2018-08-24 23:39:08

标签: algorithm language-agnostic string-comparison string-matching levenshtein-distance

我正在寻找一种找到两个字符串之间最接近的字符串匹配的方法,这些字符串最终可能具有非常不同的大小。 假设我一方面有一个可能的位置列表,例如:

  

优胜美地国家公园

     

优胜美地山谷

     

优胜美地国家公园旅馆

     

优胜美地国家公园游客中心

     

旧金山

     

旧金山金门公园

     

巴黎

     

纽约

     

曼哈顿纽约

     

香港

另一方面,我有多个句子,例如:

  1. “我在1984年11月12日疯狂时向我的妻子求婚 加利福尼亚优胜美地中部暴雨“
  2. “我喜欢在纽约中央公园walk狗”
  3. “我爱香港”

现在说我想从这组句子中提取位置,我将继续这样做吗?我知道Levenshtein distance algorithm,但是我不确定它在这里是否可以有效地工作,尤其是因为我有更多的位置和更多的句子可供尝试和匹配。我想我希望对每个位置都具有某种匹配分数,以便我可以选择得分最高的那个,但是我不知道如何计算该分数。

你们对如何做到有任何想法吗?甚至是实现或python包?

预先感谢

2 个答案:

答案 0 :(得分:2)

您可能要查看来自维基百科的Aho-Corasick algorithm

  

在计算机科学中,Aho–Corasick算法是一个字符串搜索   Alfred V. Aho和Margaret J. Corasick发明的算法。它是一个   一种定位字典元素的字典匹配算法   输入文本内的一组有限的字符串(“字典”)。它   同时匹配所有字符串。该算法的复杂度为   字符串长度与搜索长度成线性关系   文字加上输出匹配项的数量。

在您的示例中,字符串字典是位置列表,输入文本是句子。有几种使用多种语言的实现,我建议使用flashtext(Python),并举一个例子:

docs.microsoft

输出

SZ_THDOCPROP_CANONICALNAME

答案 1 :(得分:1)

对于这样的工作,您通常使用来按以下一般顺序处理某些事情:

  1. 删除诸如“ a”,“ an”,“ the”,“ is”之类的“噪声”词(也称为“停用词”)。如果您四处张望,可以找到各种停用词列表以进行过滤。
  2. 为语料库中的每个“文档”创建向量空间模型。
  3. 创建查询的向量空间模型。
  4. 计算类似TF-IDF或查询向量与每个候选文档向量之间的余弦距离之类的东西。
  5. 选择最高分代表最有可能的比赛。

参考

  1. Onix stop word list
  2. NLTK stop word list
  3. vector space model
  4. cosine similarity
  5. cosine similarity
  6. tf-idf
  7. tf-idf vs. cosine similarity

我可能应该补充一点,当您有大量文档时,更经常使用这种管道,并且每个文档分别也要大得多。由于“文档”和“查询”的表示方式完全相同,因此在您希望对文档进行分类和分组的情况下(也就是查找彼此相似的文档),它也很有用/有用。