相关疑难解决方法(0)

找到两个字符串之间的相似性度量

如何在Python中获得字符串与另一个字符串类似的概率?

我想获得像0.9(意味着90%)等十进制值.最好使用标准的Python和库.

例如

similar("Apple","Appel") #would have a high prob.

similar("Apple","Mango") #would have a lower prob.
Run Code Online (Sandbox Code Playgroud)

python probability similarity metric

245
推荐指数
11
解决办法
17万
查看次数

使用LSH进行近似字符串匹配

我想使用Locality敏感哈希来大致匹配字符串.我有很多字符串> 10M可能包含错别字.对于每个String,我想与所有其他字符串进行比较,并根据某个阈值选择具有编辑距离的字符串.

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

但是,我不明白如何表示字符串.如果是文本,我将在向量空间中表示.我的主要问题是,如果使用LSH这是易处理的,然后是字符串的适当矢量表示.

我可以使用已经实现的库来执行此任务吗?或者这取决于我的问题,所以我必须自己实施?是否有任何python包执行此操作?

python string hash locality-sensitive-hash

11
推荐指数
1
解决办法
5681
查看次数

awk unix - 匹配正则表达式 - 正则表达式字符串大小限制 | 想法?

以下代码用作最小示例。它在文本中搜索一个不匹配的正则表达式(后来是一个大的 DNA 文件)。

awk 'BEGIN{print match("CTGGGTCATTAAATCGTTAGC...", /.ATC|A.TC|AA.C|AAT./)}'

Run Code Online (Sandbox Code Playgroud)

后来我对找到正则表达式的位置感兴趣。因此 awk 命令更复杂。就像这里解决了一样

如果我想搜索更多的不匹配和更长的字符串,我会想出很长的正则表达式:

example: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" with 3 mismatches "." allowed:
/
...AAAAAAAAAAAAAAAAAAAAAAAAAAA|
..A.AAAAAAAAAAAAAAAAAAAAAAAAAA|
..AA.AAAAAAAAAAAAAAAAAAAAAAAAA|
-
- and so on. (actually 4060 possibilities)

/
Run Code Online (Sandbox Code Playgroud)

我的解决方案的问题是:

  • awk 不会接受很长的正则表达式!(限制似乎在大约 80.000 个字符)
  • 错误:“bash:/usr/bin/awk:参数列表太长”
  • 可能的解决方案:SO-Link但我没有找到解决方案...

我的问题是:

  • 我还能以某种方式使用长正则表达式吗?
    • 拆分字符串并多次运行命令可能是一个解决方案,但是我会得到重复的结果。
  • 有没有另一种方法来解决这个问题?
    • (“agrep”会起作用,但不能找到位置)

regex awk

7
推荐指数
1
解决办法
176
查看次数

使用fuzzywuzzy 的字符串匹配——是使用Levenshtein 距离还是Ratcliff/Obershelp 模式匹配算法?

Fuzzywuzzy是一个非常流行的字符串匹配库。根据库的文档,提到它使用 Levenshtein 距离来计算序列之间的差异。但是仔细检查后,我发现它实际上使用SequenceMatcherdifflib库中的函数。根据文档,此函数使用 Ratcliff/Obershelp 模式匹配算法。

根据定义,Levenshtein 距离是将一个字符串转换为另一个字符串所需的最小编辑次数,Ratcliff/Obershelp 模式匹配算法计算匹配字符的两倍数除以两个字符串中的字符总数。比较两者的密切相关帖子

当我运行一个例子时,我得到了 Fuzzywuzzy 中 SequenceMatcher 和 ratio 函数的相同结果。

from difflib import SequenceMatcher
from fuzzywuzzy import fuzz
s = SequenceMatcher(None, "abcd", "bcde")
s.ratio()
# 0.75
fuzz.ratio("abcd", "bcde")
# 75
Run Code Online (Sandbox Code Playgroud)

如果我手动计算两个字符串之间的 Levenshtein 距离,我想它只会是 2。在这种情况下,它如何像贡献者在文档中所写的那样使用 Levenshtein 距离?

python string-matching levenshtein-distance

5
推荐指数
1
解决办法
2831
查看次数

python-Levenshtein比率计算

我有以下两个字符串:

a = 'bjork gudmundsdottir'
b = 'b. gudmundsson gunnar'
Run Code Online (Sandbox Code Playgroud)

两者之间的 Levenshtein 距离是12。当我使用以下公式计算 Levenshtein 距离时,我得到了0.01python-Levenshtein库的差异:

>>> Ldist / max(len( a ), len( b ))
>>> float(12)/21
0.5714285714285714
# python-Levenshtein
Levenshtein.ratio(a,b)
0.5853658536585366
# difflib
>>> seq=difflib.SequenceMatcher(a=a,b=b)
>>> seq.ratio()
0.5853658536585366
Run Code Online (Sandbox Code Playgroud)

造成这种差异的原因是什么?我在计算中做错了什么。请注意,我已经回顾了这个How python-Levenshtein.ratio 计算类似的问题,它并没有完全回答我的问题。

有人可以解释一下用于计算上述比率的公式吗?

python levenshtein-distance

2
推荐指数
1
解决办法
3721
查看次数