标签: fuzzywuzzy

使用 Python 对大数据集进行模糊逻辑

我的团队一直坚持在两个大型数据集上运行模糊逻辑算法。第一个(子集)大约有 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

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

Pandas将每一行与数据框中的所有行进行比较,并将结果保存在每行的列表中

我试图通过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)

但我不明白怎么弄这个.

python data-analysis pandas fuzzywuzzy

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

Python模糊匹配只有第一个首字母的名字

我有一个案例,我需要将给定字符串中的名称与名称数据库相匹配。下面我给出了一个非常简单的例子,说明我遇到的问题,我不清楚为什么一个案例对另一个案例有效?如果我没记错的话,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)

python fuzzywuzzy

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

比FuzzyWuzzy更好的方法?

我得到的结果模糊不清,效果不理想。如果中间有多余的单词,则由于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更好的方法?

python fuzzy-search fuzzywuzzy

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

没有名为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)

有没有人有这个问题的经验?

python version python-3.x fuzzywuzzy

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

运行 fuzzywuzzy/fuzz.py 时出错

我有一个程序,它使用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)

任何人都知道是什么原因导致出现该错误?

python fuzzy-search fuzzywuzzy

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

在一个Python数据帧/字典中搜索另一个数据帧中的模糊匹配

我有以下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 string-matching python-2.7 pandas fuzzywuzzy

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

如何在 python 中对运行模糊模糊字符串匹配逻辑的 2m 行进行多处理?当前代码非常慢

我是 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)

python performance multiprocessing fuzzywuzzy

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

Group by 模糊字符串与 fuzzywuzzy 和 groupby 匹配

我有一个随机单词和名称的数据集,我正在尝试对所有相似的单词和名称进行分组。因此给出下面的数据框:

     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)

python pandas fuzzywuzzy

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

为什么fuzzywuzzy不考虑字符顺序

考虑这个例子:

>> 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出现在字符串的前面。

这是一个概念错误还是我在这里没有使用正确的记分器?

python fuzzy-search fuzzywuzzy

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