我的团队一直坚持在两个大型数据集上运行模糊逻辑算法。第一个(子集)大约有 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
我试图通过fuzzywuzzy.fuzzy.partial_ratio()> = 85,在大熊猫DF所有行比较每行写在结果列表的每一行.
in: df = pd.DataFrame( {'id':[1, 2, 3, 4, 5, 6], 'name':['dog', 'cat', 'mad cat', 'good dog', 'bad dog', 'chicken']})
Run Code Online (Sandbox Code Playgroud)
使用pandas函数与fuzzywuzzy库得到结果:
out:
id name match_id_list
1 dog [4, 5]
2 cat [3, ]
3 mad cat [2, ]
4 good dog [1, 5]
5 bad dog [1, 4]
6 chicken []
Run Code Online (Sandbox Code Playgroud)
但我不明白怎么弄这个.
我有一个案例,我需要将给定字符串中的名称与名称数据库相匹配。下面我给出了一个非常简单的例子,说明我遇到的问题,我不清楚为什么一个案例对另一个案例有效?如果我没记错的话,extractOne() 的 Python 默认算法是 Levenshtein 距离算法。是不是因为 Clemens 的名字提供了前两个首字母,而 Gonzalez 的案例中只有一个?
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
s = ['Gonzalez, E. walked down the street.', 'Gonzalez, R. went to the market.', 'Clemens, Ko. reach the intersection; Clemens, Ka. did not.']
names = []
for i in s:
name = [] #clear name
for k in i.split():
if k[0].isupper(): name.append(k)
else: break
names.append(' '.join(name))
if ';' in i:
for each in i.split(';')[1:]:
name = [] #clear name
for k in …Run Code Online (Sandbox Code Playgroud) 我得到的结果模糊不清,效果不理想。如果中间有多余的单词,则由于levenshtein的差异,分数会更低。
例:
from fuzzywuzzy import fuzz
score = fuzz.ratio('DANIEL CARTWRIGHT', 'DANIEL WILLIAM CARTWRIGHT')
print(score)
score = fuzz.ratio('DANIEL CARTWRIGHT', 'DAVID CARTWRIGHT')
print(score)
score = fuzz.partial_ratio('DANIEL CARTWRIGHT', 'DANIEL WILLIAM CARTWRIGHT')
print(score)
score = fuzz.partial_ratio('DANIEL CARTWRIGHT', 'DAVID CARTWRIGHT')
print(score)
Run Code Online (Sandbox Code Playgroud)
结果:81 85 71 81
我正在寻找第一对(丹尼尔vs丹尼尔·威廉姆)比第二对(丹尼尔vs大卫)更好的比赛。
有没有比Fuzzywuzzy更好的方法?
我为python3安装了带有pip的fuzzywuzzy.当我做点子列表时,我看到了
fuzzywuzzy (0.8.1)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试导入时,我收到一个错误.
Python 3.4.0 (default, Jun 19 2015, 14:20:21)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import fuzzywuzzy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'fuzzywuzzy'
>>>
Run Code Online (Sandbox Code Playgroud)
有没有人有这个问题的经验?
我有一个程序,它使用fuzzywuzzy来匹配 csv,并查找任何可能重复或非常相似的字符串。当我比较两个文件时,fuzzywuzzy引发以下错误:
WARNING:root:Applied processor reduces input query to empty string all comparisons will have score 0. [Query:'+']
Run Code Online (Sandbox Code Playgroud)
任何人都知道是什么原因导致出现该错误?
我有以下pandas数据框,包含50,000个唯一行和20列(包含相关列的片段):
df1:
PRODUCT_ID PRODUCT_DESCRIPTION
0 165985858958 "Fish Burger with Lettuce"
1 185965653252 "Chicken Salad with Dressing"
2 165958565556 "Pork and Honey Rissoles"
3 655262522233 "Cheese, Ham and Tomato Sandwich"
4 857485966653 "Coleslaw with Yoghurt Dressing"
5 524156285551 "Lemon and Raspberry Cheesecake"
Run Code Online (Sandbox Code Playgroud)
我还有以下数据框(我也以字典形式保存),它有2列和20,000个唯一行:
df2(也保存为dict_2)
PROD_ID PROD_DESCRIPTION
0 548576 "Fish Burger"
1 156956 "Chckn Salad w/Ranch Dressing"
2 257848 "Rissoles - Lamb & Rosemary"
3 298770 "Lemn C-cake"
4 651452 "Potato Salad with Bacon"
5 100256 "Cheese Cake - Lemon Raspberry …Run Code Online (Sandbox Code Playgroud) 我是 python 的新手,我正在一个包含 200 万条记录的列表上运行一个模糊模糊的字符串匹配逻辑。该代码工作,它是给输出为好。问题是它非常慢。在 3 小时内,它仅处理 80 行。我想通过让它一次处理多行来加快速度。
如果有帮助 - 我正在我的机器上运行它,它有 16Gb RAM 和 1.9 GHz 双核 CPU。
下面是我正在运行的代码。
d = []
n = len(Africa_Company) #original list with 2m string records
for i in range(1,n):
choices = Africa_Company[i+1:n]
word = Africa_Company[i]
try:
output= process.extractOne(str(word), str(choices), score_cutoff=85)
except Exception:
print (word) #to identify which string is throwing an exception
print (i) #to know how many rows …Run Code Online (Sandbox Code Playgroud) 我有一个随机单词和名称的数据集,我正在尝试对所有相似的单词和名称进行分组。因此给出下面的数据框:
Name ID Value
0 James 1 10
1 James 2 2 142
2 Bike 3 1
3 Bicycle 4 1197
4 James Marsh 5 12
5 Ants 6 54
6 Job 7 6
7 Michael 8 80007
8 Arm 9 47
9 Mike K 10 9
10 Michael k 11 1
Run Code Online (Sandbox Code Playgroud)
我的伪代码类似于:
import pandas as pd
from fuzzywuzzy import fuzz
minratio = 95
for idx1, name1 in df['Name'].iteritems():
for idx2, name2 in df['Name'].iteritems():
ratio = fuzz.WRatio(name1, name2)
if ratio …Run Code Online (Sandbox Code Playgroud) 考虑这个例子:
>> from fuzzywuzzy import process
>> choices = ['account', 'update', 'query']
>> process.extract('u', choices)
[('account', 90), ('update', 90), ('query', 90)]
Run Code Online (Sandbox Code Playgroud)
在上述情况下,对于我的最终用户来说,帐户排名高于给定字符串的更新是令人困惑的。在这种情况下,由于列表顺序,帐户恰好被任意放置在前面,因为所有比赛都有相同的分数。然而,我本以为update会有更高的分数,因为字符u出现在字符串的前面。
这是一个概念错误还是我在这里没有使用正确的记分器?
fuzzywuzzy ×10
python ×10
fuzzy-search ×3
pandas ×3
fuzzy-logic ×1
performance ×1
python-2.7 ×1
python-3.x ×1
version ×1