使用ML纠正拼写

时间:2018-03-23 13:20:37

标签: python pandas machine-learning

我的列中包含可能包含拼写错误的城市名称。

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

myst="""1 Mumbai
2 Delhi
3 Delhi
4 Mumbai
5 Mumbai
6 Delhi
7 Dolhi
"""
u_cols=['customer_id', 'city']

myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep=' ', names = u_cols)

当我按城市分组时,我可以看到错误的拼写...

df['city'].value_counts()
Delhi     3
Mumbai    3
Dolhi     1

我可以使用像这样的替换方法轻松纠正它......

df.replace({'Dolhi': 'Delhi'})['city'].value_counts()

但是没有办法知道可能的拼写错误。如果有2个相似的单词,则计数较高的单词被认为是正确的。所以在这种情况下,"德里"是正确的" Dolhi"是错的。 是否可以应用任何此类"情报"这个数据帧数据?

1 个答案:

答案 0 :(得分:2)

您可以计算每对城市之间的Levenshtein distance,这是两个字符串相似度的度量。基本上,将字符串转换为另一个字符串(例如,更改字符或添加/删除字符)所需的每个更改都会将Levenshtein距离增加1。 nltk包中包含edit_distance()函数,该函数返回Levenshtein距离。

您可以使用itertools.combinations()遍历所有唯一城市对,并检查Levenshtein距离是否低于某个魔术阈值,例如:此示例中为1。请注意,此阈值需要一些手动调整才能合并不同的城市名称,同时仍能捕获所有拼写错误。

然后,您可以通过比较数据集中使用它们的频率,找到正确的名称(下面的main_name)和错误的名称(下面的mistake)。当然,假设人们在大多数时间都会正确地写出城市名称。

import itertools
from nltk.metrics import edit_distance

MAGIC_THRESHOLD = 1

city_names = df['city'].value_counts()

for name_a, name_b in itertools.combinations(city_names.index, 2):
    if edit_distance(name_a, name_b) <= MAGIC_THRESHOLD:
        count_a, count_b = city_names[name_a], city_names[name_b]
        main_name, mistake = (name_a, name_b) if count_a > count_b else (name_b, name_a)
        df = df.replace({mistake: main_name})

print(df['city'].value_counts())

结果给了我们:

Delhi     4
Mumbai    3