标签: fuzzywuzzy

Pyspark levenshtein连接错误

我想基于Levenshtein距离执行连接。

我有2张桌子:

  1. Data:这是HDFS文件存储库中的CSV。列之一是Disease description,15K行。
  2. df7_ct_map:我从Hive呼叫的表格。列之一是Disease Indication,20K行。

我试图通过将每个描述与适应症(它们是疾病的文字描述)相匹配来连接两个表。理想情况下,它们必须相同,但是如果两个文本都不相同,我希望选择包含最大数量的常用单词的匹配文本。

from pyspark.sql.functions import levenshtein  
joinedDF = df7_ct_map.join( Data, levenshtein(df7_ct_map("description"), 
Data("Indication")) < 3)
joinedDF.show(10)
Run Code Online (Sandbox Code Playgroud)

问题DataDataFrame这就是为什么我得到以下错误:

TypeError: 'DataFrame' object is not callable
TypeError                                 Traceback (most recent call last)
in engine
----> 1 joinedDF = df7_ct_map.join( Data, levenshtein(df7_ct_map("description"), Data("Indication")) < 3)

TypeError: 'DataFrame' object is not callable
Run Code Online (Sandbox Code Playgroud)

一些忠告?我可以使用Fuzzywuzzy软件包吗?如果是这样,怎么办?

python levenshtein-distance apache-spark-sql fuzzywuzzy pyspark

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

使用pandas和fuzzwuzzy匹配相似的列元素

我有一个excel文件,在一列中包含1000多个公司名称,在另一列中包含大约20,000个公司名称.

目标是尽可能多地匹配名称.问题是第一列(1000+)中的名称格式不正确,这意味着"公司名称"字符串看起来像"9Com(panynAm9e00").我正试图找出解决此问题的最佳方法.(仅12个名字完全匹配)

在尝试了不同的方法后,我最终试图在每个名称中匹配4-5个或更多字符,具体取决于每个字符串的长度,使用正则表达式.但我只是在努力寻找最有效的方法来做到这一点.

例如:

第1栏

 1. 9Com(panynAm9e00 
 2. NikE4 
 3. Mitrosof2
Run Code Online (Sandbox Code Playgroud)

第2栏

 1. Microsoft
 2. Company Name
 3. Nike
Run Code Online (Sandbox Code Playgroud)

获取第1列中的第一个元素并在第2列中查找匹配项.如果没有完全匹配,则查找具有4-5个相同字符的字符串.

有什么建议?

python pandas fuzzywuzzy

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

python Fuzzywuzzy 限制,它是如何工作的?

极限是如何与 python 的fuzzywuzzy 模块一起工作的,它是什么意思?

matches = process.extract(query, choices, limit=2, scorer=fuzz.partial_ratio)
Run Code Online (Sandbox Code Playgroud)

fuzzy fuzzy-logic python-3.x fuzzywuzzy

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

在数据框的两列应用模糊匹配分数

我有数据框:

df =
    original_title                     title
      Mexico Oil                    Gas Summit
      Mexico Oil                    Gas Summit
Run Code Online (Sandbox Code Playgroud)

我必须模糊匹配这两个(original_title & title)列的实体并获得分数。下面是我的代码:

compare = pd.MultiIndex.from_product([ df['original_title'],df ['title'] ]). to_series()
def metrics (tup):
    return pd.Series([fuzz.partial_ratio(*tup),fuzz.token_sort_ratio(*tup)], ['partial', 'token'])

compare.apply(metrics)
Run Code Online (Sandbox Code Playgroud)

上面的代码将每个原始标题与整个标题列进行比较。同时,我希望它将每个原始标题与每行中的标题进行比较。我的预期结果是:

df =
 original_title                    title                 partial_ratio
 Mexico Oil                      Africa Oil                   81
 French Property Exhibition      French                      100
 French Exhibition               French Exhibition           100
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助。谢谢

python fuzzywuzzy

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

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

有什么方法可以在熊猫中使用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
查看次数

在列表中查找具有匹配字符串值及其计数的模糊匹配字符串

我有一个列表A,如下所示。

A = ['vikash','vikas','Vinod',Vikky','Akash','Vinodh','Sachin','Salman,'Ajay','Suchin','Akash','vikahs']
Run Code Online (Sandbox Code Playgroud)

我想将列表中的每个元素与每个元素进行匹配,并找到每个元素的匹配率90%或以上的模糊匹配字符串以及匹配元素的数量。

我的结果应该如下数据框中所示。

string  Matching strings count
===============================
Vikash  vikas,vikahs      2
vikas   vikash,vikahs     2
vinod   vinodh            1
Vikky                     0
Akash   Akash             1
...
..
Vikahs vikash,vikas       2
Run Code Online (Sandbox Code Playgroud)

由于我是Python新手,有人可以帮助我实现这一目标吗?

谢谢

python fuzzywuzzy

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

针对包含大量元素(例如 200,000)的列表优化 RapidFuzz

我想在包含 200,000 个元素的列表上运行本文中提到的这段rapidfuzz 代码。我想知道优化它以在 GPU 上更快运行的最佳方法是什么?

在列表中查找具有匹配字符串值及其计数的模糊匹配字符串

import pandas as pd
from rapidfuzz import fuzz

elements = ['vikash', 'vikas', 'Vinod', 'Vikky', 'Akash', 'Vinodh', 'Sachin', 'Salman', 'Ajay', 'Suchin', 'Akash', 'vikahs']

results = [[name, [], 0] for name in elements]

for (i, element) in enumerate(elements):
    for (j, choice) in enumerate(elements[i+1:]):
        if fuzz.ratio(element, choice, score_cutoff=90):
            results[i][2] += 1
            results[i][1].append(choice)
            results[j+i+1][2] += 1
            results[j+i+1][1].append(element)

data = pd.DataFrame(results, columns=['name', 'duplicates', 'duplicate_count'])


Run Code Online (Sandbox Code Playgroud)

预期输出 -

name        duplicates  duplicate_count
0   vikash           [vikas]                1
1    vikas  [vikash, vikahs]                2 …
Run Code Online (Sandbox Code Playgroud)

python python-3.x fuzzywuzzy rapidfuzz

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