【问题标题】:Approximate String Matching using LSH使用 LSH 进行近似字符串匹配
【发布时间】:2023-03-23 19:37:02
【问题描述】:

我想使用局部敏感哈希来近似匹配字符串。我有许多字符串> 10M,可能包含拼写错误。对于每个字符串,我想与所有其他字符串进行比较,并根据某个阈值选择具有编辑距离的字符串。

也就是说,简单的解决方案需要 O(n^2) 次比较。为了避免这个问题,我正在考虑使用Locality Sensitive Hashing。然后接近相似的字符串会导致相同的桶,我只需要在桶内搜索。所以它是 O(n*C),其中 C 是桶的大小。

但是,我不明白如何表示字符串。如果是文本,我会在向量空间中表示。我的主要问题是这是否可以使用 LSH 以及字符串的适当向量表示来处理。

我可以使用已经实现的库来完成这项任务吗?还是取决于我的问题,所以我必须自己实施?有没有这样做的python包?

【问题讨论】:

  • 我不明白这个问题。您说您知道“如果是文本”该怎么做,但您不知道如何处理字符串?在您的脑海中,“文本”和“字符串”之间的相关区别是什么让这个问题无法解决?
  • 我可以使用向量空间模型来表示文本。在字符串的情况下,我没有外观向量,而是代表不同事物的 ASCII 代码向量。
  • 我看到了问题。我熟悉的 LSH 版本(早期版本)采用欧几里得度量。使用字符串,您可以使用字符串度量标准......这是行不通的。你需要一个非欧几里得空间的 LSH。

标签: python string hash locality-sensitive-hash


【解决方案1】:

我在该主题上找到的最好的学术资源是 Chapter 3 的海量数据集挖掘,它对局部敏感散列和 minhashing 提供了一个很棒的概述。

简单地说,这个想法是获取几个字符串,将这些字符串向量化,然后在结果向量上传递一个滑动窗口。如果两个向量在同一窗口位置具有相同的值,则将它们标记为候选,以进行更细粒度的相似性分析。

Python 数据草图库 (pip install datasketch) 中有一个很棒的实现。这是一个示例,显示您可以捕获模糊字符串相似性:

from datasketch import MinHash, MinHashLSH
from nltk import ngrams

data = ['minhash is a probabilistic data structure for estimating the similarity between datasets',
  'finhash dis fa frobabilistic fata ftructure for festimating the fimilarity fetween fatasets',
  'weights controls the relative importance between minizing false positive',
  'wfights cfntrols the rflative ifportance befween minizing fflse posftive',
]

# Create an MinHashLSH index optimized for Jaccard threshold 0.5,
# that accepts MinHash objects with 128 permutations functions
lsh = MinHashLSH(threshold=0.4, num_perm=128)

# Create MinHash objects
minhashes = {}
for c, i in enumerate(data):
  minhash = MinHash(num_perm=128)
  for d in ngrams(i, 3):
    minhash.update("".join(d).encode('utf-8'))
  lsh.insert(c, minhash)
  minhashes[c] = minhash

for i in xrange(len(minhashes.keys())):
  result = lsh.query(minhashes[i])
  print "Candidates with Jaccard similarity > 0.4 for input", i, ":", result

这会返回:

Candidates with Jaccard similarity > 0.4 for input 0 : [0, 1]
Candidates with Jaccard similarity > 0.4 for input 1 : [0, 1]
Candidates with Jaccard similarity > 0.4 for input 2 : [2, 3]
Candidates with Jaccard similarity > 0.4 for input 3 : [2, 3]

【讨论】:

  • 阈值为 0.5 时,仅返回输入。要获得正确的结果需要 0.42 或更低的阈值(python 3.5 和当前版本的数据草图)
  • @duhaime 这个代码在python 3 上工作吗?当我使用它时,我得到输出Candidates with Jaccard similarity > 0.5 for input 0 : [0] 和类似的1 : [1] 等等
  • @iam.Carrot 我刚刚在 3.6.1(Anaconda 发行版)上进行了测试,得到了上面的输出。也许尝试更新您的数据草图和 nltk 库? pip install datasketch -U && pip install nltk -U
  • @duhaime 我也试过了。我正在使用 IDLE 它仍然显示相同当我将阈值降低到 0.4 它开始提供您显示的输出
  • @duhaime 请您看看我的问题here 并提及您的回答是否可以解决我的问题?会有很大帮助
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2015-05-22
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2010-09-08
  • 2016-03-28
相关资源
最近更新 更多