标签: fuzzy-comparison

模糊文本搜索:正则表达式通配符搜索生成器?

我想知道是否有某种方法可以在PHP中进行模糊字符串匹配.寻找一个长字符串中的单词,找到一个潜在的匹配,即使它拼写错误; 如果由于OCR错误而被一个字符关闭的东西会找到它.

我在想一个正则表达式生成器可能能够做到这一点.因此,如果输入"疯狂",它将生成此正则表达式:

.*((crazy)|(.+razy)|(c.+azy)|cr.+zy)|(cra.+y)|(craz.+)).*
Run Code Online (Sandbox Code Playgroud)

然后它将返回该单词的所有匹配或该单词的变体.

如何构建生成器: 我可能会将搜索字符串/单词拆分为一个字符数组,并构建正则表达式,将新创建的数组替换为键值(字符串中字母的位置). +".

这是进行模糊文本搜索的好方法还是有更好的方法?怎么样的字符串比较,根据它的接近程度给我一个分数?我试图看看一些转换不良的OCR文本是否包含一个单词.

php regex ocr fuzzy-search fuzzy-comparison

3
推荐指数
1
解决办法
1929
查看次数

更好的模糊匹配性能?

我目前使用的方法get_close_matches从法difflib迭代通过15000个字符串列表以获得对大约15000串的另一个列表最接近的匹配:

a=['blah','pie','apple'...]
b=['jimbo','zomg','pie'...]

for value in a:
    difflib.get_close_matches(value,b,n=1,cutoff=.85)
Run Code Online (Sandbox Code Playgroud)

每个值需要 0.58 秒,这意味着完成循环需要 8,714 秒或 145 分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个数组转换为小写,但它只会导致速度略有增加。

python performance fuzzy-comparison difflib levenshtein-distance

3
推荐指数
2
解决办法
5667
查看次数

R 中近似子串匹配的位置

我正在使用 R 进行字符串处理。我有一个带有一列字符串的数据框,例如:

 df <- data.frame(textcol=c("In this substring would like to find the position of this substring",
 "I would also like to find the position of thes substring",
 "No match here","No mention of this substrangy thing"))

 matchPattern <- "this substring"
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个函数(取决于某种距离参数,例如 Jarro-Winkler)将采用我的 matchPattern,将其与数据框文本列的每一行进行比较,并返回匹配项中匹配项的确切位置字符串,即第一个元素为 36(除非我数错),第二个元素(可能)为 43,第三个元素为 NA,第四个元素为 14(?)。

r fuzzy-comparison

3
推荐指数
1
解决办法
966
查看次数

自动化文本/模糊匹配的最佳机器学习方法

我是机器学习的新手,我在python中完成了一些项目.我正在寻找有关如何解决以下问题的建议,我认为这可以实现自动化.

我组织中的数据质量团队中的用户每天都要获取已手动输入的公司名称(带地址)列表,然后他必须使用他的判断搜索公司数据库以查找匹配结果 - 即没有硬性规定.

输入的一个例子是:

公司名称,地址第1行,国家

其中,用户获取公司名称并将其输入搜索工具.在他被提供结果列表并且他选择最佳比赛但可能选择不选择任何比赛.搜索工具内置并与外部API通信,我可以访问源代码,因此我可以修改搜索工具来捕获输入,结果列表,我可以添加一个复选框以查看使用了哪个结果和一个复选框表示没有选择.因此,这将成为我标记的训练数据.

从结果中使用的列来做出判断大致相同:

公司名称,地址第1行,国家

鉴于像Stack Overflow这样的公司名称,结果可能会返回Stack Overflow Ltd.,Stacking Overflowing Shelves Ltd.等.输入数据相当不错,因此结果通常会产生大约10个匹配,对于人类来说,相当明显的是哪一个选择.

我的想法是,通过足够的训练数据,我可以直接使用搜索词调用API,然后从结果列表中选择适当的结果.

这是通过ML可以实现的吗?我正在努力解决每次数据都不同的事实.关于实现这一目标的最佳方法的想法是受欢迎的,特别是如何为模型构建数据以及使用何种分类器等.

machine-learning fuzzy-comparison text-classification record-linkage

3
推荐指数
1
解决办法
1万
查看次数

Python的缩写检测

我正在尝试衡量公司名称的相似性,但是在尝试匹配这些名称的缩写时遇到了困难。例如:

IBM
The International Business Machines Corporation
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用fuzzywuzzy来衡量相似性:

>>> fuzz.partial_ratio("IBM","The International Business Machines Corporation")
33
>>> fuzz.partial_ratio("General Electric","GE Company")
20
>>> fuzz.partial_ratio("LTCG Holdings Corp","Long Term Care Group Inc")
39
>>> fuzz.partial_ratio("Young Innovations Inc","YI LLC")
33
Run Code Online (Sandbox Code Playgroud)

您是否知道任何技术可以衡量此类缩写的更高相似度?

python string nlp similarity fuzzy-comparison

3
推荐指数
1
解决办法
4455
查看次数

具有字符串的两个列表的相似度得分

我有一个字符串列表作为查询和一些其他字符串列表的hundrends.我想将查询与其他列表进行比较,并提取它们之间的相似性分数.

例:

query = ["football", "basketball", "martial arts", "baseball"]

list1 = ["apple", "football", "basketball court"]

list2 = ["ball"]

list3 = ["martial-arts", "baseball", "banana", "food", "doctor"]
Run Code Online (Sandbox Code Playgroud)

我现在在做什么,我对结果不满意是对它们的绝对比较.

score = 0
for i in query:
   if i in list1:
      score += 1

score_of_list1 = score*100//len(list1)
Run Code Online (Sandbox Code Playgroud)

我找到了一个可以帮助我模糊的图书馆,但我在想,如果你还有其他方法可以提出建议.

python comparison similarity string-comparison fuzzy-comparison

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

名称的近似字符串匹配算法

我正在寻找以下示例的模糊字符串算法:给定现有名称的数据库,如果匹配准确度高于输入阈值(比如90%),则将输入匹配到最匹配的名称,否则为NA

database = [James Bond, Michael Smith]
Run Code Online (Sandbox Code Playgroud)

输入

James L Bond->James Bond
JBondL->James Bond
Bond,James->James Bond
BandJamesk->James Bond
Jenny,Bond->N/A
Run Code Online (Sandbox Code Playgroud)

目前,大多数算法如Levenstein和基于语音的算法(如Soundex)都无法匹配像BondJames这样的倒置名称.到目前为止,余弦和提花产生了最好的结果,但我正在寻找更多,以便我可以选择最佳或可能组合的算法.

string algorithm string-matching fuzzy-comparison approximate

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

如何在给定的datetime值restiriction下填充数据框中的列?

鉴于熊猫数据框架df1df2:

df1:

                           d  v
0 2018-02-16 13:39:55.562506  1
1 2018-02-16 10:18:56.768246  4
Run Code Online (Sandbox Code Playgroud)

并且df2:

                           d   vx
0 2018-02-16 13:39:56.668377  100
1 2018-02-16 14:01:05.766319  200
Run Code Online (Sandbox Code Playgroud)

如何df1使用vx值扩展df2,以便时间戳几乎相同,即值的差异不超过2秒(和NaN不匹配)?

例:

                           d  v     vx
0 2018-02-16 10:18:56.768246  4    NaN
1 2018-02-16 13:39:55.562506  1  100.0
Run Code Online (Sandbox Code Playgroud)

以下是代码:

import pandas as pd
import datetime as dt

dt1 = dt.datetime(2018, 2, 16, 13, 39, 55, 562506)
dt2 = dt.datetime(2018, 2, 16, 10, 18 , 56, …
Run Code Online (Sandbox Code Playgroud)

python fuzzy-comparison dataframe python-datetime pandas

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

如何在 R 中创建类似发音的名称组?

我想根据名称选择的相似程度创建一个组变量。我已经开始使用 stringdist 包来生成距离的度量。但我不确定如何使用该输出信息来生成一组变量。我看过 hclust 但似乎使用聚类函数你需要知道你最终需要多少组,我不知道。我开始的代码如下:

name_list <- c("Mary", "Mery", "Mary", "Joe", "Jo", "Joey", "Bob", "Beb", "Paul")

name_dist <- stringdistmatrix(name_list)
name_dist
name_dist2 <- stringdistmatrix(name_list, method="soundex")
name_dist2
Run Code Online (Sandbox Code Playgroud)

我想看到一个包含两列的数据框,看起来像

name = c("Mary", "Mery", "Mary", "Joe", "Jo", "Joey", "Bob", "Beb", "Paul")

name_group = c(1, 1, 1, 2, 2, 2, 3, 3, 4)
Run Code Online (Sandbox Code Playgroud)

显然,根据我使用的距离测量方式,这些组可能略有不同(我在上面建议了两个),但我可能会选择一个或另一个来跑步。

基本上,如何在不知道我想要的集群数量的情况下从距离矩阵到组变量?

grouping r fuzzy-comparison stringdist

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

在熊猫中执行模糊字符串匹配的更快方法

有什么方法可以在熊猫中使用fuzzywuzzy来加速模糊字符串匹配。


我有一个数据框,extra_names它的名称我想与另一个数据框运行模糊匹配names_df

>> extra_names.head()

     not_matching
0 Vij Sales
1 Crom Electronics 
2 REL Digital
3 Bajaj Elec
4 Reliance Digi

>> len(extra_names)
6500

>> names_df.head()

         names   types
0 Vijay Sales        1
1 Croma Electronics  1
2 Reliance Digital   2
3 Bajaj Electronics  2
4 Pai Electricals    2

>> len(names_df)
250
Run Code Online (Sandbox Code Playgroud)

截至目前,我正在使用以下代码运行逻辑,但它需要永远完成。

choices = names_df['names'].unique().tolist()

def fuzzy_match(row):
    best_match = process.extractOne(row, choices)
    return best_match[0], best_match[1] if best_match else '',''

%%timeit
extra_names['best_match'], extra_names['match%'] = extra_names['not_matching'].apply(fuzzy_match)
Run Code Online (Sandbox Code Playgroud)

当我发布这个问题时,查询仍在运行。有没有办法加快这个模糊字符串匹配过程?

python fuzzy-comparison pandas fuzzywuzzy

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

我的for循环只会提供最后的结果,而不是所有结果

我试图使用分数比较两个文本之间的相似性.这是我的代码:

risk_list1_txt = []
scoreList = []
similarityDict = {}
theScore = 0
for text1 in risk_list1:
    similarityDict['FileName'] = text1
    theText1 = open(path1 + "\\" + text1).read().lower()
    for text2 in range(len(risk_list2)):
        theText2 = open(path2 + "\\" + risk_list2[text2]).read().lower()
        theScore = fuzz.token_set_ratio(theText1,theText2)
        similarityDict[risk_list2[text2]] = theScore
    outFile= open(fileDestDir,'w')
    outFile.write(str(theScore))
outFile.close()
Run Code Online (Sandbox Code Playgroud)

问题是我的outfile只给了我最后一次比较的分数,虽然我在risk_list1和risk_list2中有3个不同的文本文件.我无法让这个循环正常运行.

python for-loop fuzzy-comparison

0
推荐指数
1
解决办法
70
查看次数

Python中类似字符串的百分比?

我不知道如何做一个程序,它给出了相同长度的两个字符串的相似程度.

例如,对于abcdabce它应该给75%.

订单很重要,我不希望它给我这个abcd并且dcab有100%.

我知道Levenshtein模块可以做到这一点,但我想要一个能够实现它的程序.

python string fuzzy-comparison

-3
推荐指数
1
解决办法
2223
查看次数