Ruby上有一个类似于Python的difflib的库吗?
特别是,我需要一个方法类似于difflib.get_close_matches.有什么建议?
我有一个有点高级别的问题,所以我会尝试尽可能具体.
我正在进行大量研究,涉及将不同的数据集与引用同一实体(通常是公司或财务安全性)的标题信息相结合.此记录链接通常涉及标题信息,其中名称是唯一的公共主要标识符,但通常可用某些辅助信息(例如城市和州,操作日期,相对大小等).这些匹配通常是一对多,但可能是一对一甚至多对多.我通常手工完成这种匹配或者对清理过的子串进行非常基本的文本比较.我偶尔使用一种简单的匹配算法,比如Levenshtein距离测量,但我从来没有太多的东西,部分是因为我没有一个很好的正式应用方法.
我的猜测是,这是一个相当普遍的问题,并且必须有一些正式的流程可以用来做这类事情.我已经阅读了一些关于这个主题的学术论文,这些论文涉及给定方法的理论适用性,但我没有找到任何有用的资料来完成一个配方或至少一个实际的框架.
我的问题如下:
有没有人知道实现多维模糊记录匹配的良好来源,如书籍或网站,发表的文章或工作文件?
我更喜欢有实际例子和明确方法的东西.
该方法可以是迭代的,人工检查中间阶段的改进.
(编辑)链接数据用于统计分析.因此,一点点的噪音是可以的,但是对于较少的"错误的不匹配"而言,更少的"不正确的匹配"是强烈的偏好.
如果他们在Python中是很棒的,但不是必需的.
最重要的是,如果重要的是,我不太关心计算效率.我没有动态实现它,我通常处理几千条记录.
theory algorithm string-matching fuzzy-comparison record-linkage
我试图在python中使用TRE -library来匹配拼写错误的输入.
重要的是,它确实能很好地处理utf-8编码的字符串.
一个例子:
德国首都的名字是柏林,但是从发音来看它是一样的,如果人们会写"Bärlin"
它到目前为止工作,但如果非ASCII字符位于检测到的字符串的第一个或第二个位置,则范围和检测到的字符串本身都不正确.
# -*- coding: utf-8 -*-
import tre
def apro_match(word, list):
fz = tre.Fuzzyness(maxerr=3)
pt = tre.compile(word)
for i in l:
m = pt.search(i,fz)
if m:
print m.groups()[0],' ', m[0]
if __name__ == '__main__':
string1 = u'Berlín'.encode('utf-8')
string2 = u'Bärlin'.encode('utf-8')
string3 = u'B\xe4rlin'.encode('utf-8')
string4 = u'Berlän'.encode('utf-8')
string5 = u'London, Paris, Bärlin'.encode('utf-8')
string6 = u'äerlin'.encode('utf-8')
string7 = u'Beälin'.encode('utf-8')
l = ['Moskau', string1, string2, string3, string4, string5, string6, string7]
print '\n'*2
print "apro_match('Berlin', l)"
print "="*20 …Run Code Online (Sandbox Code Playgroud) 我想将两个字符串分类为相似或不相似.例如
s1 = "Token is invalid. DeviceId = deviceId: "345" "
s2 = "Token is invalid. DeviceId = deviceId: "123" "
s3 = "Could not send Message."
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个可以在两个字符串之间给出匹配分数的java库,从该分数我可以确定它们是否相似.我的程序只需要处理一个小数据集(~2000字符串).你知道那里有什么东西吗?
我有很多字符串(城市名称),即使用户打错字,我也想找到城市的名称。
例
用户键入“ chcago”,系统将找到“ Chicago”
当然,我可以为列表中的所有字符串计算查询的Levenshtein距离,但这将非常慢。
有什么有效的方法可以执行这种字符串匹配吗?
我有两个示例数据帧,如下所示:
df1 = pd.DataFrame({'Name': {0: 'John', 1: 'Bob', 2: 'Shiela'},
'Degree': {0: 'Masters', 1: 'Graduate', 2: 'Graduate'},
'Age': {0: 27, 1: 23, 2: 21}})
df2 = pd.DataFrame({'Name': {0: 'John S.', 1: 'Bob K.', 2: 'Frank'},
'Degree': {0: 'Master', 1: 'Graduated', 2: 'Graduated'},
'GPA': {0: 3, 1: 3.5, 2: 4}})
Run Code Online (Sandbox Code Playgroud)
我想使用模糊匹配方法基于两列“名称”和“度”将它们合并在一起,以排除可能的重复项。这是我在此处的参考帮助下所实现的: 在数据框列上应用模糊匹配并将结果保存在新列中
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
compare = pd.MultiIndex.from_product([df1['Name'],
df2['Name']]).to_series()
def metrics(tup):
return pd.Series([fuzz.ratio(*tup),
fuzz.token_sort_ratio(*tup)],
['ratio', 'token'])
compare.apply(metrics)
compare.apply(metrics).unstack().idxmax().unstack(0)
compare.apply(metrics).unstack(0).idxmax().unstack(0)
Run Code Online (Sandbox Code Playgroud)
假设一个人的fuzz.ratio的名字和学位的比率都高于80,我们认为他们是同一个人。并将df1中的Name和Degree作为默认值。如何获得以下预期结果?谢谢。
df = df1.merge(df2, on = ['Name', …Run Code Online (Sandbox Code Playgroud) 我有一个公司名称列表,我有一个url提到公司名称的列表.
最终目标是查看网址,并找出网址中有多少公司在我的列表中.
示例URL:http://www.dmx.com/about/our-clients
每个URL的结构都不同,因此我没有很好的方法来进行正则表达式搜索并为每个公司名称创建单独的字符串.
我想构建一个for循环来从列表中搜索URL的整个内容中的每个公司.但看起来Levenshtein对于两个较小的字符串更好,而不是短字符串和大量文本.
这个初学者应该在哪里看?
我的团队一直坚持在两个大型数据集上运行模糊逻辑算法。第一个(子集)大约有 180K 行,包含我们需要在第二个(超集)中匹配的人员的姓名、地址和电子邮件。超集包含 250 万条记录。两者具有相同的结构,并且数据已经被清理,即解析地址、标准化名称等。
- 联系人ID int,
- 全名 varchar(150),
- 地址 varchar(100),
- 电子邮件 varchar(100)
目标是将子集中的行中的值与超集中的相应值进行匹配,因此输出将组合子集和超集以及每个字段(标记)的相应相似性百分比。
- 联系方式,
- 查找联系人ID,
- 全名,
- 查找全名,
- 全名_相似度,
- 地址,
- 查找地址,
- 地址_相似度,
- 电子邮件,
- 查找电子邮件,
- 电子邮件_相似度
为了首先简化和测试代码,我们连接了字符串,并且我们知道代码可以在非常小的超集上运行;然而,一旦我们增加记录数量,它就会陷入困境。我们尝试了不同的算法,Levenshtein、FuzzyWuzzy 等,但均无济于事。在我看来,问题在于 Python 是逐行执行的;不过,我不确定。我们甚至尝试使用流式传输在 Hadoop 集群上运行它;然而,它尚未取得任何积极成果。
#!/usr/bin/env python
import sys
from fuzzywuzzy import fuzz
import datetime
import time
import Levenshtein
#init for comparison
with open('normalized_set_record_set.csv') as normalized_records_ALL_file:
# with open('delete_this/xab') as normalized_records_ALL_file:
normalized_records_ALL_dict = {}
for line in normalized_records_ALL_file:
key, value = line.strip('\n').split(':', 1)
normalized_records_ALL_dict[key] = value
# normalized_records_ALL_dict[contact_id] = concat_record
def score_it_bag(target_contact_id, target_str, ALL_records_dict): …Run Code Online (Sandbox Code Playgroud) python fuzzy-logic fuzzy-comparison fuzzywuzzy record-linkage
我需要比较两个非结构化地址,并能够确定它们是否相同(或足够相似)。
我知道我们可以使用一些模糊逻辑进行这种比较,对拼写错误有一定的容忍度,但是......
我不想重新发明轮子。在不同的上下文中,这个问题似乎是一个普遍关注的问题,我认为有一种算法(可能稍作修改)可能适合这种情况。
提前致谢
我正在尝试使用 R 包RecordLinkage将采购订单列表中的项目与主目录中的条目进行匹配。下面是 R 代码和使用两个虚拟数据集(DOrders 和 DCatalogue)的可重现示例:
DOrders <- structure(list(Product = structure(c(1L, 2L, 7L, 3L, 4L, 5L,
6L), .Label = c("31471 - SOFTSILK 2.0 SCREW 7mm x 20mm", "Copier paper white A4 80gsm",
"High resilience memory foam standard mattress", "Liston forceps bone cutting 152mm",
"Micro reciprocating blade 25.4mm x 8.0mm x 0.38mm", "Micro reciprocating blade 39.5 x 7.0 x 0.38",
"microaire dual tooth 18 x 90 x 0.89"), class = "factor"), Supplier = structure(c(5L,
6L, 2L, 1L, 4L, …Run Code Online (Sandbox Code Playgroud) fuzzy-comparison ×10
python ×5
algorithm ×3
fuzzy-logic ×2
string ×2
data-linking ×1
dataframe ×1
duplicates ×1
fuzzy ×1
fuzzywuzzy ×1
java ×1
linkage ×1
match ×1
pandas ×1
performance ×1
r ×1
regex ×1
ruby ×1
theory ×1
tre-library ×1