我正在尝试根据 Python 中的用户名和姓氏映射来自不同系统的用户。
一个问题是,在很多情况下,名字都是“昵称”。例如,对于一个用户,他的名字在一个系统中是“Dave”,而在另一个系统中是“David”。
在 python 中有没有简单的方法可以将这些常见的昵称转换为正式的昵称?
谢谢!
我正在尝试根据 Python 中的用户名和姓氏映射来自不同系统的用户。
一个问题是,在很多情况下,名字都是“昵称”。例如,对于一个用户,他的名字在一个系统中是“Dave”,而在另一个系统中是“David”。
在 python 中有没有简单的方法可以将这些常见的昵称转换为正式的昵称?
谢谢!
不是专门在 Python 中,而是尝试使用这个:
http://deron.meranda.us/data/nicknames.txt
如果将该数据加载到 python ( csv.reader(<FileObject>, delimiter='\t')
) 中,则可以执行加权概率类型函数以返回该列表中昵称的全名。
你可以这样做:
import collections
def weighted_choice_sub(weights):
# Source for this function:
# http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/
rnd = random.random() * sum(weights)
for i, w in enumerate(weights):
rnd -= w
if rnd < 0:
return i
def load_names():
with open(<filename>, 'r') as infile:
outdict = collections.defaultdict(list)
for line in infile.readlines():
tmp = line.strip().split('\t')
outdict[tmp[0]].append((tmp[1], float(tmp[2])))
return outdict
def full_name(nickname):
names = load_names()
return names[nickname][weighted_choice_sub([x[1] for x in names[nickname]])][0]
您必须创建一个数据库或哈希映射昵称到正式名称。如果你能在网上找到这样的列表,那么实现地图的过程将是微不足道的。真正的乐趣将是获得一个足够完整的列表,确保处理变化,并确保当人们的正式名称是他们的昵称时您不会遇到问题。例如,并不是每个叫戴夫的人都有一个正式的名字大卫。这个人的正式名字很可能是戴夫。
In [1]: first_name_dict = {'David':['Dave']}
In [2]: def get_real_first_name(name):
...: for first_name in first_name_dict:
...: if first_name == name:
...: return name
...: elif name in first_name_dict[first_name]:
...: return first_name
...: else:
...: return name
...:
In [3]: get_real_first_name('David')
Out[3]: 'David'
In [4]: get_real_first_name('Dave')
Out[4]: 'David'
我正在使用 Ipython。基本上你需要一本字典来做到这一点。first_name_dict 是您的名字字典。例如,大卫可以称为“戴夫”或“戴维”,而卢卡斯可以称为“卢克”,那么你可以这样写字典:
first_name_dict = {'David' : ['Dave', 'Davy'], 'Lucas' : ['Luke']}
您可以通过添加“不区分大小写”匹配来改进解决方案