【问题标题】:string matching - best distance algorithm to use字符串匹配 - 使用的最佳距离算法
【发布时间】:2020-11-11 12:23:31
【问题描述】:

我有两个数据框,df1df2,其中包含有关投票站的信息。数据帧具有不同的长度。两个数据框都有一个名为ps_name 的列,这是投票站的名称,还有一个名为district 的列,表示投票站位于哪个区。

我正在尝试匹配ps_name 列上的字符串,同时阻塞district 列,因此我可以将匹配项上的geolocations(纬度和经度)列从df1 复制到df2

到目前为止,我已经尝试在阈值 0.88 处使用 jaro-winkler 来比较字符串。

# Matched:
**df1:** AGRICULTURAL OFFICE ATTOCK (MALE) I (P)
**df2:** AGRICULTURAL OFFICE ATTOCK (MALE) (P)

# Did not match:
**df1:** govt girls high school peoples colony attock ii
**df2:** high school peoples colony attock ii

我应该使用什么字符串距离算法?我已经尝试过 jaro-winkler 并且还在考虑 smith-waterman

【问题讨论】:

  • 我还有一个问题:其中一对正在匹配但不应匹配的投票站具有以下格式:'government high school X','government high school Y'。它们被匹配是因为 X 和 Y 是短词。我正在考虑将字符串分成“government high school”和“X”,“Y”以匹配“X”和“Y”而不是整个字符串,但我想知道这对其余的字符串如何工作没有这个问题。

标签: python pandas dataframe string-matching jaro-winkler


【解决方案1】:

一种选择是使用Levenshtein distance,它在包fuzzywuzzy(或here)中实现,算法在O(n + d^2)中运行,其中n是较长字符串的长度,并且d 是编辑距离。

例子:

from fuzzywuzzy import fuzz
fuzz.ratio('govt girls high school peoples colony attock ii','high school peoples colony attock ii') 
#87
fuzz.ratio('AGRICULTURAL OFFICE ATTOCK (MALE) I (P)', 'AGRICULTURAL OFFICE ATTOCK (MALE) (P)')
#97

【讨论】:

  • 你如何得出结果,Levenshtein 距离可以用 O(n + d^2) 计算?它不应该是 O(N*M),因为它必须在嵌套循环中遍历两个字符串吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2010-12-24
  • 2017-05-01
  • 2019-05-27
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多