免责声明:我是一个无知的Linux + Anaconda noob.
现在,解决这个问题:我正在尝试将Fuzzywuzzy安装到我的64位Linux上的Anaconda发行版中.当我这样做,其试图改变我conda,并conda-env给conda-forge渠道.如下:
我通过写作搜索anaconda模糊的wuzzy:
anaconda search -t fuzzywuzzy
Run Code Online (Sandbox Code Playgroud)
这表明在64位Linux上可用于anaconda的最新版本在频道上提供0.13 conda-forge.
要在命令行中安装,请键入:
conda install -c conda-forge fuzzywuzzy=0.13.0
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
The following packages will be downloaded:
package | build
---------------------------|-----------------
conda-env-2.6.0 | 0 1017 B conda-forge
python-levenshtein-0.12.0 | py27_0 138 KB conda-forge
conda-4.2.13 | py27_0 375 KB conda-forge
fuzzywuzzy-0.11.0 | py27_0 15 KB conda-forge
------------------------------------------------------------
Total: 528 KB
The following new packages will be INSTALLED:
fuzzywuzzy: 0.11.0-py27_0 conda-forge
python-levenshtein: 0.12.0-py27_0 conda-forge
The following packages …Run Code Online (Sandbox Code Playgroud) 我在python中学习fuzzywuzzy,理解fuzz.ratio,fuzz.partial_ratio,fuzz.token_sort_ratio和fuzz.token_set_ratio的概念.我的问题是何时使用哪个功能?我先检查2个字符串的长度,如果不相似,那么排除fuzz.partial_ratio吗?或者,如果2个字符串的长度相似,我将使用fuzz.token_sort_ratio?或者我应该总是使用fuzz.token_set_ratio?
谁知道SeatGeek使用什么标准?
我正在尝试建立一个房地产网站,思考使用fuzzywuzzy来比较地址.
任何见解都非常感激.
R.
我有以下问题
我有一个包含句子的数据框主文件,例如
master
Out[8]:
original
0 this is a nice sentence
1 this is another one
2 stackoverflow is nice
Run Code Online (Sandbox Code Playgroud)
对于Master中的每一行,我使用查找到另一个Dataframe 从站以获得最佳匹配fuzzywuzzy.我使用fuzzywuzzy,因为两个数据帧之间的匹配句子可能有点不同(额外的字符等).
例如,奴隶可能是
slave
Out[10]:
my_value name
0 2 hello world
1 1 congratulations
2 2 this is a nice sentence
3 3 this is another one
4 1 stackoverflow is nice
Run Code Online (Sandbox Code Playgroud)
这是一个功能齐全,精彩,紧凑的工作示例:)
from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
import difflib
master= pd.DataFrame({'original':['this is a nice sentence', …Run Code Online (Sandbox Code Playgroud) 我有两个超过一百万个名称的列表,命名约定略有不同.这里的目标是匹配那些相似的记录,具有95%置信度的逻辑.
我知道有一些我可以利用的库,比如Python中的FuzzyWuzzy模块.
然而,就处理而言,似乎将占用太多资源,将1个列表中的每个字符串与另一个列表进行比较,在这种情况下,似乎需要100万乘以另外的百万次迭代次数.
这个问题还有其他更有效的方法吗?
更新:
所以我创建了一个bucketing函数,并应用了一个简单的规范化,即删除空格,符号并将值转换为小写等...
for n in list(dftest['YM'].unique()):
n = str(n)
frame = dftest['Name'][dftest['YM'] == n]
print len(frame)
print n
for names in tqdm(frame):
closest = process.extractOne(names,frame)
Run Code Online (Sandbox Code Playgroud)
通过使用pythons pandas,将数据加载到按年分组的较小桶中,然后使用FuzzyWuzzy模块,process.extractOne用于获得最佳匹配.
结果仍然有点令人失望.在测试期间,上面的代码用于仅包含5千个名称的测试数据框,并且占用将近一个小时.
测试数据被拆分.
我正在用他们的YM在同一桶中的桶进行比较.
问题可能是因为我使用的FuzzyWuzzy模块?感谢任何帮助.
我正在尝试在充满组织名称的 PANDAS 列中寻找潜在匹配项。我目前正在使用 iterrows() 但它在具有 ~70,000 行的数据帧上非常慢。在查看了 StackOverflow 之后,我尝试实现一个 lambda 行(应用)方法,但这似乎几乎没有加快速度,如果有的话。
数据框的前四行如下所示:
index org_name
0 cliftonlarsonallen llp minneapolis MN
1 loeb and troper llp newyork NY
2 dauby o'connor and zaleski llc carmel IN
3 wegner cpas llp madison WI
Run Code Online (Sandbox Code Playgroud)
以下代码块有效,但需要大约五天的时间来处理:
org_list = df['org_name']
from fuzzywuzzy import process
for index, row in df.iterrows():
x = process.extract(row['org_name'], org_list, limit=2)[1]
if x[1]>93:
df.loc[index, 'fuzzy_match'] = x[0]
df.loc[index, 'fuzzy_match_score'] = x[1]
Run Code Online (Sandbox Code Playgroud)
实际上,对于每一行,我将组织名称与所有组织名称的列表进行比较,取前两个匹配项,然后选择第二个最佳匹配项(因为顶部匹配项将是相同的名称),然后设置一个条件分数必须高于 93 才能创建新列。我创建附加列的原因是我不想简单地替换值——我想先仔细检查结果。
有没有办法加快这个速度?我阅读了几篇博客文章和 StackOverflow 问题,这些问题讨论了“向量化”这段代码,但我的尝试失败了。我还考虑过简单地创建一个 70,000 x 70,000 Levenshtein 距离矩阵,然后从中提取信息。有没有更快的方法来为列表或 PANDAS …
我有两个数据帧,每个数据帧都有不同的行数.下面是每个数据集的几行
df1 =
Company City State ZIP
FREDDIE LEES AMERICAN GOURMET SAUCE St. Louis MO 63101
CITYARCHRIVER 2015 FOUNDATION St. Louis MO 63102
GLAXOSMITHKLINE CONSUMER HEALTHCARE St. Louis MO 63102
LACKEY SHEET METAL St. Louis MO 63102
Run Code Online (Sandbox Code Playgroud)
和
df2 =
FDA Company FDA City FDA State FDA ZIP
LACKEY SHEET METAL St. Louis MO 63102
PRIMUS STERILIZER COMPANY LLC Great Bend KS 67530
HELGET GAS PRODUCTS INC Omaha NE 68127
ORTHOQUEST LLC La Vista NE 68128
Run Code Online (Sandbox Code Playgroud)
我和他们并肩使用combined_data = pandas.concat([df1, …
尝试编写一个代码来比较多个文件并返回多个选项之间的最高模糊比。
问题是我收到一条错误消息:
警告:根:应用处理器将输入查询减少为空字符串,所有比较得分为 0。[查询:'/'] 警告:根:应用处理器将输入查询减少为空字符串,所有比较得分为 0。[查询: '.']
而且导出的文件基本上是空白的。知道为什么会发生这种情况吗?
from fuzzywuzzy import fuzz, process
import csv
def readfile( filen ):
with open(filen,'r') as f:
contents = f.readlines()
return contents
def write_fuzzy( fileo, file1, file2 ):
matches=[]
for item1 in file1:
matches.append(process.extract( str(item1), file2, limit=2 )[0][0])
with open( fileo, 'w' ) as f:
w = csv.writer( f, delimiter = ',' )
w.writerows( matches )
filenames = ['Documents/test_CSV_1.csv',\
'Documents/test_CSV_2.csv']
file_contents = []
for filen in filenames:
file_contents.append( readfile( filen ) )
write_fuzzy( 'out.csv', …Run Code Online (Sandbox Code Playgroud) 我在 Python 中使用 Fuzzywuzzy 来匹配 2 个列表中的人名。但是,运行时间太长,因为一个列表包含 25000 个名称,另一个包含 39000 个名称。它已经运行了20个小时。
以前,我使用相同的代码来匹配具有 6000 和 3000 个名称的 2 个列表,运行时间为 1 小时。基于此,我当前工作的运行时间将需要 50 多个小时。
下面是我的代码:
names_array=[]
ratio_array=[]
def match_names(wrong_names,correct_names):
for row in wrong_names:
x=process.extractOne(row, correct_names, scorer=fuzz.token_set_ratio)
names_array.append(x[0])
ratio_array.append(x[1])
return names_array,ratio_array
df=pd.read_csv("wrong-country-names.csv",encoding="ISO-8859-1")
wrong_names=df['name'].dropna().values
choices_df=pd.read_csv("country-names.csv",encoding="ISO-8859-1")
correct_names=choices_df['name'].values
name_match,ratio_match=match_names(wrong_names,correct_names)
Run Code Online (Sandbox Code Playgroud)
我fuzz.token_set_ratio根据我拥有的数据选择作为得分手来执行这场多对多比赛。
下面是示例数据:
wrong_names = ['Alberto Steve', 'David Lee']
correct_names = ['Alberto Lee Steve', 'David Steve Lee']
Run Code Online (Sandbox Code Playgroud)
基本上,错误名称列表不包含中间名,为了忽略这一点并生成合理的匹配,我选择了fuzz.token_set_ratio.
通过在线研究,我找到了一个安装 python levenshtein 包的解决方案,以将运行时间加快 4-10 倍。但是,我的工作现在已经运行了 20 多个小时,我不想破坏当前的工作,所以我会在这之后尝试一下。
我想知道是否还有其他选择可以改善这一点。
提前致谢。
我得到低于错误。有没有办法在不安装 python-Levenshtein 的情况下修复它,如果没有,那么如何在 linux 上安装 python-Levenshtein。
UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning
warnings.warn
Run Code Online (Sandbox Code Playgroud) 我们有一个第三方“工具”,可以查找相似的名称并在两个名称之间分配相似度分数。
我应该尽可能地模仿该工具的行为。在网上搜索后,尝试了距离方法。使用fuzzywuzzy进行同样的操作。
matches = process.extractBests(
name,
choices,
score_cutoff=50,
scorer=fuzz.token_sort_ratio,
limit=1
);
Run Code Online (Sandbox Code Playgroud)
它给出的结果接近工具结果。但是,很少有异常值 - 如下所示。
经过互联网上的进一步搜索,我了解到进一步的细化需要实施某种机器学习。我是机器学习领域的新手 - 因此寻求一些关于我下一步应该尝试进一步改进代码的建议。
谢谢!
fuzzywuzzy ×10
python ×10
pandas ×3
fuzzy-search ×2
algorithm ×1
anaconda ×1
dask ×1
linux ×1
package ×1
performance ×1
python-3.x ×1
runtime ×1