在Python中将用户昵称转换为正式的名字

时间:2012-11-28 22:45:36

标签: python

我正在尝试根据Python中的用户名和姓来映射来自不同系统的用户。

一个问题是名字在很多情况下都是'昵称'。 例如,对于用户来说,他的名字在一个系统中是'Dave',在另一个系统中是'David'。

有没有简单的方法在python中将这些常见的昵称转换为正式的昵称?

谢谢!

3 个答案:

答案 0 :(得分:5)

不是专门针对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]

答案 1 :(得分:0)

您必须在正式名称上创建数据库或哈希映射昵称。如果您可以在线找到这样的列表,那么实现地图的过程将是微不足道的。真正的乐趣将是获得一个完整的列表,确保变化得到妥善处理,并确保当人们的正式名称是他们的昵称时,您不会遇到问题。并非每个去过戴夫的人都有正式的大卫名字。这个人的正式名字很可能是戴夫。

答案 2 :(得分: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']}

您可以通过添加“不区分大小写”匹配来改进解决方案