我得到低于错误。有没有办法在不安装 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)
它给出的结果接近工具结果。但是,很少有异常值 - 如下所示。
经过互联网上的进一步搜索,我了解到进一步的细化需要实施某种机器学习。我是机器学习领域的新手 - 因此寻求一些关于我下一步应该尝试进一步改进代码的建议。
谢谢!
我试图了解python模块Fuzzywuzzy的功能process.extract()如何工作?
我主要在这里阅读有关Fuzzywuzzy软件包的信息:http ://chairnerd.seatgeek.com/fuzzywuzzy-fuzzy-string-matching-in-python/ ,这是一篇很棒的文章,解释了尝试进行模糊匹配时的不同情况。他们讨论了部分字符串相似性的几种方案:
1)乱序
2)令牌排序
3)令牌集
然后,从这篇文章中:https : //pathindependence.wordpress.com/2015/10/31/tutorial-fuzzywuzzy-string-matching-in-python-improving-merge-accuracy-across-data-products-and-naming -conventions /我学习了如何使用Fuzzywuzzy的process.extract()函数基本上选择前k个匹配项。
我找不到太多有关process.extract()函数如何工作的信息。这是我在其GitHub页面(https://github.com/seatgeek/fuzzywuzzy/blob/master/fuzzywuzzy/process.py)上找到的定义/信息,该功能是:
在选择的列表或词典中查找最佳匹配,返回包含匹配及其得分的元组列表。如果使用字典,则还返回每个匹配项的键。
但是,它没有提供有关如何找到最佳方法的详细信息?是否需要我在上面提到的所有3个方案中找到该方案?
我之所以问是因为,当我使用此函数时,有时会有两个非常相似但不匹配的字符串。
例如在我当前的样本数据集中,要匹配的字符串
“总补货提前期(以工作日为单位)”
它与
“ PLANNING_TIME_FENCE_CODE”,“ BUILD_IN_WIP_FLAG”
但不是(正确的答案)
“ FULL_LEAD_TIME”
即使正确的答案像“待匹配字符串”那样具有“提前期”,但它根本不与待匹配字符串匹配。为什么?并以某种方式使看起来不像待匹配字符串的其他匹配。为什么?我现在很笨。
我有两个带有姓名列表的数据框
df1[name] -> number of rows 3000
df2[name] -> number of rows 64000
Run Code Online (Sandbox Code Playgroud)
我使用 fuzzy wuzzy 使用以下代码从 df2 中获取 df1 条目的最佳匹配:
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
matches = [process.extract(x, df1, limit=1) for x in df2]
Run Code Online (Sandbox Code Playgroud)
但这需要很长时间才能完成。有没有更快的方法来对 pandas 中的字符串进行模糊匹配?
我在企业级使用 python fuzzywuzzy 来匹配 2 个字符串。它在大多数情况下工作正常,但在下面提到的场景中会产生意想不到的结果:
fuzz.partial_ratio('ja rule:mesmerize','ja rule feat. ashanti:mesmerize') gives output 65
Run Code Online (Sandbox Code Playgroud)
和
fuzz.partial_ratio('ja rule:mesmerize','jennifer lopez feat. ja rule:im real ') gives the output 67
Run Code Online (Sandbox Code Playgroud)
有什么解释为什么第二场比赛的模糊分数比第一场比赛更好吗?
非常感谢任何帮助/建议。
这是一个字符串T:
'男士衬衫团队 brienne 有趣的讽刺衬衫具有图形 T 恤杯子 婴儿装 真正的激情 辉煌的设计 详细的插图 强烈的欣赏 东西 创意 br 商店 在不同的衬衫上发现了数千种设计 婴儿装杯子 有趣的流行文化 抽象 诙谐 很多设计使一天好起来 几乎所有其他人都会遇到 ul li 质量短袖圆领衬衫 100 棉柔软耐用舒适手感合身标准尺寸怀疑 l xl 可用 li li 可持续性标签公司构想的信念纺织品行业开始采取行动,负责任地制造棉 li li 服装使用 state art 直接服装设备印刷裂纹剥离水洗 li li图形 T 恤设计专业印刷独特的设计看起来很棒让人微笑有趣可爱的复古富有表现力的艺术品 li ul'
我已经突出显示了上面字符串的一部分,因为上面是字符串的预处理版本,因此可能难以阅读。
我得到以下值:
fuzz.partial_ratio('short sleeve', T) 给 50
fuzz.partial_ratio('long sleeve', T) 给 73
fuzz.partial_ratio('dsfsdf sleeve', T) 给 62
fuzz.partial_ratio('sleeve', T) 给 50
我对此感到非常困惑。第一个和第四个值不应该是 100 吗?当然我错过了一些东西,但我无法弄清楚。
编辑:这是我在卸载 python-Levenshtein 库后运行的另一个示例:
'第一个成功方式妻子告诉 v 2 长袖衬衫 …
我有以下数据框:
d_test = {
'name' : ['South Beach', 'Dog', 'Bird', 'Ant', 'Big Dog', 'Beach', 'Dear', 'Cat'],
'cluster_number' : [1, 2, 3, 3, 2, 1, 4, 2]
}
df_test = pd.DataFrame(d_test)
Run Code Online (Sandbox Code Playgroud)
我想识别name列中相似的名称(如果这些名称属于一个簇编号)并为它们创建唯一的 ID。例如South Beach和Beach属于簇号1,它们的相似度得分相当高。所以我们将它与唯一的 id 关联起来,比如说1。下一个簇是数字2,列中的三个实体name属于该簇:Dog、Big Dog和Cat。Dog并且Big Dog具有很高的相似度分数,并且他们的唯一 ID 将是,比如说2。对于Cat唯一的 id 来说,是3。等等。
我为上面的逻辑创建了一个代码:
# pip install thefuzz
from thefuzz import fuzz …Run Code Online (Sandbox Code Playgroud) 我打算尝试使用带有调整过的可接受分数参数的 Fuzzywuzzy 基本上它会检查单词是否按原样在词汇表中,如果不是,它会要求 Fuzzywuzzy 选择最佳模糊匹配,并接受列表令牌,如果它至少是一个特定的分数。
如果这不是处理大量拼写错误和拼写略有不同但相似的单词的最佳方法,我愿意接受建议。
问题是子类一直抱怨它有一个空词汇表,这没有任何意义,因为当我在代码的同一部分使用常规计数向量化器时,它工作正常。
它会吐出很多这样的错误: ValueError: empty words; 也许文档只包含停用词
我错过了什么?我还没有让它做任何特别的事情。它应该像往常一样工作:
class FuzzyCountVectorizer(CountVectorizer):
def __init__(self, input='content', encoding='utf-8', decode_error='strict',
strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None,
token_pattern="(?u)\b\w\w+\b", ngram_range=(1, 1), analyzer='word',
max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False,
dtype=numpy.int64, min_fuzzy_score=80):
super().__init__(
input=input, encoding=encoding, decode_error=decode_error, strip_accents=strip_accents,
lowercase=lowercase, preprocessor=preprocessor, tokenizer=tokenizer, stop_words=stop_words,
token_pattern=token_pattern, ngram_range=ngram_range, analyzer=analyzer, max_df=max_df,
min_df=min_df, max_features=max_features, vocabulary=vocabulary, binary=binary, dtype=dtype)
# self._trained = False
self.min_fuzzy_score = min_fuzzy_score
@staticmethod
def remove_non_alphanumeric_chars(s: str) -> 'str':
pass
@staticmethod
def tokenize_text(s: str) -> 'List[str]':
pass
def fuzzy_repair(self, sl: 'List[str]') -> …Run Code Online (Sandbox Code Playgroud) 我有一个这样的输入表:
In [182]: data_set
Out[182]:
name ID
0 stackoverflow 123
1 stikoverflow 322
2 stack, overflow 411
3 internet.com 531
4 internet 112
5 football 001
Run Code Online (Sandbox Code Playgroud)
我想根据模糊模糊对类似的字符串进行分组。因此,在应用模糊匹配后,所有超过某个相似度阈值(如 > %90 相似度)的字符串将组合在一起。所以期望的输出是:
In [182]: output
Out[182]:
name ID group
0 stackoverflow 123 1
1 stikoverflow 322 1
2 stack, overflow 411 1
3 internet.com 531 2
4 internet 112 2
5 football 001 3
Run Code Online (Sandbox Code Playgroud)
我正在搜索不同的主题,我发现这个和这个只是名称匹配而不是聚类。此外,这个只显示了最佳匹配,它对我没有帮助。这个页面也解释了k-means聚类需要预先设置聚类的数量,这在这种情况下是不切实际的。
更新:
我发现包中的process方法可以在fuzzywuzzy某种程度上解决我的问题。但是此方法仅将字符串与列表进行比较,而不是将列表与列表进行比较:
from fuzzywuzzy import …Run Code Online (Sandbox Code Playgroud) 背景
我有 2 个数据框,没有可以将它们合并的公共密钥。两个 df 都有一个包含“实体名称”的列。一个 df 包含 8000 多个实体,另一个 df 包含接近 2000 个实体。
样本数据:
vendor_df=
Name of Vendor 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
regulator_df =
Name of Entity Committies
LACKEY SHEET METAL Private
PRIMUS STERILIZER COMPANY LLC Private
HELGET GAS PRODUCTS INC Autonomous
ORTHOQUEST LLC Governmant
Run Code Online (Sandbox Code Playgroud)
问题说明:
我必须模糊匹配这两个 ( Name …
fuzzywuzzy ×10
python ×10
pandas ×4
fuzzy-logic ×2
fuzzy-search ×1
python-2.7 ×1
python-3.x ×1
scikit-learn ×1
string ×1