我正在寻找一个可以进行简单的模糊字符串比较的 Python 模块。具体来说,我想要字符串相似程度的百分比。我知道这可能是主观的,所以我希望找到一个可以进行位置比较以及最长相似字符串匹配等的库。
基本上,我希望找到足够简单的东西来产生单个百分比,同时仍然足够可配置,以便我可以指定要进行的比较类型。
我正在努力完成的是一个程序,它读入一个文件,并根据原始句子比较每个句子.与原始句子完全匹配的句子将得到1分,而总则相反的句子将得到0.所有其他模糊句子将得到1到0之间的等级.
我不确定使用哪个操作来允许我在Python 3中完成此操作.
我已经包含了示例文本,其中文本1是原始文本,其他前面的字符串是比较.
文字1:这是一个黑暗和暴风雨的夜晚.我独自一人坐在红色的椅子上.因为我有三只猫,所以我不是一个人.
文字20:这是一个阴暗而暴风雨的夜晚.我独自一人坐在深红色的椅子上.因为我有三只猫所以我不是完全孤独//应该得分高而不是1分
文字21:这是一个阴暗而暴躁的夜晚.我独自一人坐在深红色的座位上.因为我有三只猫所以我并不是完全孤独//应该得分低于文本20
文字22:我独自一人坐在深红色的教堂上.因为我有三只猫,所以我不是一个人.这是一个阴沉而暴躁的夜晚.//应该低于文本21而不是0
文字24:这是一个黑暗和暴风雨的夜晚.我并不孤单.我没坐在红色的椅子上.我有三只猫.//应该得0分!
在我的工作中,我得到了很好的结果,使用了近似字符串匹配算法,如Damerau-Levenshtein距离,使我的代码不易受到拼写错误的影响.
现在我需要将字符串与简单的正则表达式匹配TV Schedule for \d\d (Jan|Feb|Mar|...).这意味着字符串TV Schedule for 10 Jan应返回0,同时T Schedule for 10. Jan应返回2.
这可以通过在正则表达式中生成所有字符串(在这种情况下为100x12)并找到最佳匹配来完成,但这并不实用.
您有任何想法如何有效地做到这一点?
我正在尝试清理一个数据库,这些数据库多年来获得了许多重复记录,名称略有不同.例如,在公司表中,有"Some Company Limited"和"SOME COMPANY LTD!"等名称.
我的计划是将违规表导出为R,将名称转换为小写,替换常见的同义词(如"limited" - >"ltd"),删除非字母字符然后agrep用来查看看起来相似的内容.
我的第一个问题是agrep只接受一个匹配的模式,并且循环每个公司名称以匹配其他公司名称的速度很慢.(有些待清理的表会有数十个,可能有数十万个要检查的名称.)
我已经非常简要地看了一下这个tm包(JSS文章),它看起来非常强大,但它主要用于分析大块文本,而不仅仅是名称.
我有一些相关的问题:
tm包是否适合这类任务?
有更快的替代方案agrep吗?(所述函数使用Levenshtein编辑距离,传闻速度慢.)
R中还有其他合适的工具,除了agrep和tm?
我是否应该在R中执行此操作,还是应该直接在数据库中执行此类操作?(这是一个Access数据库,所以如果可能,我宁愿避免触摸它.)
我正在寻找一种使用正则表达式进行模糊匹配的方法.我想使用Perl,但是如果有人可以推荐任何方式来做这个会有所帮助.
作为一个例子,我想匹配一个字母"纽约",前面加一个2位数.之所以遇到困难是因为文本是来自PDF的OCR,所以我想进行模糊匹配.我想要匹配:
12 New York
24 Hew York
33 New Yobk
Run Code Online (Sandbox Code Playgroud)
和其他"近距离"比赛(在Levenshtein距离意义上),但不是:
aa New York
11 Detroit
Run Code Online (Sandbox Code Playgroud)
显然,我需要指定匹配的允许距离("模糊").
据我了解,我不能使用String::ApproxPerl模块来执行此操作,因为我需要在匹配中包含正则表达式(以匹配前面的数字).
另外,我应该注意到这是我真正想要匹配的一个非常简单的例子,所以我不是在寻找一种蛮力的方法.
编辑添加:
好的,我的第一个例子太简单了.我并不是说人们会挂在前面的数字上 - 抱歉这个坏例子.这是一个更好的例子.考虑这个字符串:
ASSIGNOR, BY MESHS ASSIGN1IBNTS, TO ALUSCHALME&S MANOTAC/rURINGCOMPANY, A COBPOBATlOH OF DELAY/ABE.
这实际上是说:
ASSIGNOR, BY MESNE ASSIGNMENTS, TO ALLIS-CHALMERS MANUFACTURING COMPANY, A CORPORATION OF DELAWARE
我需要做的是提取短语"ALUSCHALME&S MANOTAC/rURINGCOMPANY"和"DELAY/ABE".(我意识到这可能看起来像疯了.但我是一个乐观主义者.)一般来说,模式看起来像这样:
/Assignor(, by mesne assignments,)? to (company name), a corporation of (state)/i
匹配是模糊的.
我有一个非常大的jpeg图像数据库,大约200万.我想模糊搜索这些图像中的重复项.重复图像是两个图像,其具有相同值的许多(大约一半)像素,其余图像的R/G/B值偏差约+/- 3.图像与肉眼相同.这是你从重新压缩jpeg中获得的那种差异.
我已经有了一种万无一失的方法来检测两个图像是否相同:我将所有像素上的增量亮度相加并与阈值进行比较.这种方法已经证明100%准确,但是对照200万张照片非常慢(每张照片的小时数).
我想以一种我可以比较哈希表中的指纹的方式对图像进行指纹处理.即使我能够可靠地减少我需要比较的图像数量只有100,我也会很好地比较1到100.对此有什么好的算法?
我一直在研究一种基于不完美字符串连接两个数据集的方法,例如公司名称.在过去,我必须匹配两个非常脏的列表,一个列表有名称和财务信息,另一个列表有名称和地址.没有唯一的ID匹配!假设清洁已经应用,并且可能有类型和插入.
到目前为止,AGREP是我发现的最接近的工具.我可以在AGREP包中使用levenshtein距离,它测量两个字符串之间的删除,插入和替换的数量.AGREP将返回距离最小的字符串(最相似).
但是,我一直无法从单个值转换此命令以将其应用于整个数据帧.我粗略地使用了for循环来重复AGREP函数,但是必须有一个更简单的方法.
请参阅以下代码:
a<-data.frame(name=c('Ace Co','Bayes', 'asd', 'Bcy', 'Baes', 'Bays'),price=c(10,13,2,1,15,1))
b<-data.frame(name=c('Ace Co.','Bayes Inc.','asdf'),qty=c(9,99,10))
for (i in 1:6){
a$x[i] = agrep(a$name[i], b$name, value = TRUE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
a$Y[i] = agrep(a$name[i], b$name, value = FALSE, max = list(del = 0.2, ins = 0.3, sub = 0.4))
}
Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用模糊匹配主要是为了找到相同名称的拼写错误和拼写错误.我需要准确理解弹性搜索的模糊匹配如何工作以及它如何使用标题中提到的2个参数.
据我所知,min_similarity是查询字符串与数据库中字符串匹配的百分比.我找不到如何计算此值的确切描述.
据我所知,max_expansions是应该执行搜索的Levenshtein距离.如果这实际上是Levenshtein距离,它将是我理想的解决方案.无论如何,它不起作用,例如我有"Samvel"这个词
queryStr max_expansions matches?
samvel 0 Should not be 0. error (but levenshtein distance can be 0!)
samvel 1 Yes
samvvel 1 Yes
samvvell 1 Yes (but it shouldn't have)
samvelll 1 Yes (but it shouldn't have)
saamvelll 1 No (but for some weird reason it matches with Samvelian)
saamvelll anything bigger than 1 No
Run Code Online (Sandbox Code Playgroud)
文档说的是我实际上不理解的东西:
Add max_expansions to the fuzzy query allowing to control the maximum number
of terms to match. Default to …Run Code Online (Sandbox Code Playgroud) 假设我有一个MDM系统(主数据管理),其主要应用是检测和防止记录重复.
每当销售代表进入系统中的新客户时,我的MDM平台就会对现有记录进行检查,计算一对单词或短语或属性之间的Levenshtein或Jaccard或XYZ距离,考虑权重和系数并输出相似度得分,等等.
您典型的模糊匹配方案.
我想知道是否有必要应用机器学习技术来优化匹配输出,即以最高精度查找重复项.
它究竟是最有意义的.
关于这个话题也有这个很好的答案,但我不知道这个人是否真的使用了ML.
另外我的理解是,加权模糊匹配已经是一个很好的解决方案,甚至可能从财务角度来看,因为无论何时部署这样的MDM系统,您都必须进行一些分析和预处理,无论是手动编码匹配规则还是培训ML算法.
所以我不确定增加ML是否代表了重要的价值主张.
任何想法都表示赞赏.
我正在建立一个关于模糊匹配的前一个问题的答案stringdist.
我有两个带有长字符串(消费品名称)的大型数据集(~30k行),我希望通过生成距离分数来模糊匹配.两个产品名称列表中存在一些预期的重叠,但某些产品对于每个列表都是唯一的.
问题在于:我的计算机正在努力用如此多的数据扩展网格,并且R不断崩溃.但是,我有一个可能有助于优化的想法 - 我无法让它发挥作用.
我的大多数字符串可以分时段到基于品牌(如数据子集pantene,neutrogena等等).而不是计算所有字符串组合之间的距离,我想grep为品牌名称,数据子集,然后计算距离.
首先,我使用与前一篇文章相同的功能.
# Function by @C8H10N4O2
greedyAssign <- function(a,b,d){
x <- numeric(length(a)) # assgn variable: 0 for unassigned but assignable,
# 1 for already assigned, -1 for unassigned and unassignable
while(any(x==0)){
min_d <- min(d[x==0]) # identify closest pair, arbitrarily selecting 1st if multiple pairs
a_sel <- a[d==min_d & x==0][1]
b_sel <- b[d==min_d & a == a_sel & x==0][1]
x[a==a_sel & b == b_sel] <- 1 …Run Code Online (Sandbox Code Playgroud) fuzzy-comparison ×10
fuzzy-search ×3
r ×3
python ×2
regex ×2
string ×2
algorithm ×1
fuzzy-logic ×1
hash ×1
nlp ×1
optimization ×1
perl ×1
tre-library ×1