Python 使用ML更正拼写

Python 使用ML更正拼写,python,pandas,machine-learning,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

我有一个关于城市名称的专栏,其中可能包含拼写错误

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()
但是没有办法知道可能的拼写错误。如果有两个相似的单词,则认为计数较高的单词是正确的。所以在这种情况下,“德里”是正确的,“多尔希”是错误的。 是否可以将任何此类“智能”应用于此数据帧数据?

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

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

然后,通过比较数据集中使用的频率,您可以找到正确的名称(
main_name
如下)和错误的名称(
error
)。当然,假设人们在大多数情况下都会正确书写城市名称

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

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

然后,通过比较数据集中使用的频率,您可以找到正确的名称(
main_name
如下)和错误的名称(
error
)。当然,假设人们在大多数情况下都会正确书写城市名称

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())