我想基于Levenshtein距离执行连接。
我有2张桌子:
Data:这是HDFS文件存储库中的CSV。列之一是Disease description,15K行。 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)
问题Data是DataFrame这就是为什么我得到以下错误:
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
我有一个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 的fuzzywuzzy 模块一起工作的,它是什么意思?
matches = process.extract(query, choices, limit=2, scorer=fuzz.partial_ratio)
Run Code Online (Sandbox Code Playgroud) 我有数据框:
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)
感谢您的帮助。谢谢
有什么方法可以在熊猫中使用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)
当我发布这个问题时,查询仍在运行。有没有办法加快这个模糊字符串匹配过程?
我有一个列表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新手,有人可以帮助我实现这一目标吗?
谢谢
我想在包含 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) fuzzywuzzy ×7
python ×6
pandas ×2
python-3.x ×2
fuzzy ×1
fuzzy-logic ×1
pyspark ×1
rapidfuzz ×1