我正在开始开发算法的过程,以根据他们的电子邮件地址确定个人的性别。我可以收到以下电子邮件:
johnsonsam@example.com
samjohnson@example.com
sjohnson@example.com
john@example.com
我的计划是尝试根据美国人口普查对最常见的名字和姓氏进行索引搜索。这适用于美国人口统计。但是,如果我能首先将上述电子邮件地址分解为以下内容,我认为会更有效率:
<wb>johnson</wb><wb>sam</wb>@example.com
<wb>sam</wb><wb>johnson</wb>@example.com
<wb>s</wb><wb>johnson</wb>@example.com
<wb>john</wb>@example.com
您是否知道可以执行此注释的任何算法(最好是在Python中)?任何其他解决此问题的建议都是受欢迎的。
答案 0 :(得分:1)
您所描述的问题称为“分词”。 wordsegment
包将为您执行此操作。它使用Google Web Trillion Word Corpus,甚至可以在名称上运行良好。
安装它:
all_rrs.where('(table.suggested_amount - table.actual_amount) / table.suggested_amount >= 0.05')
这是一个示例程序:
pip install wordsegment
以下是一些示例的输出(假设您已经将电子邮件地址中的“@”之前的部分分开):
import sys
import wordsegment
def main():
for line in sys.stdin:
print '%s -> %s' % (line.strip(), wordsegment.segment(line))
if __name__ == '__main__':
main()
您可以尝试使用人口普查数据中的名单列表,看看是否能提供更好的性能。有关如何使用自定义单词列表自行实现算法的详细信息,请参阅Norvig本章的“分词”部分:Natural Language Corpus Data。
答案 1 :(得分:0)
这是一个基本的开始,你还需要考虑分隔符(如点,下划线等),中间名和首字母。
import re
def is_name_list(cands, refs):
for c in cands:
if (len(c) > 1) and (not c in refs):
return False
return True
emails = [
'johnsonsam@example.com',
'samjohnson@example.com',
'sjohnson@example.com',
'john@example.com'
]
names = ['john', 'sam', 'johnson']
for e in emails:
print '\n' + e
at_ind = e.index('@')
user = e[0:at_ind]
for n in names:
finals = []
parts = filter(None, user.split(n))
if is_name_list(parts, names):
all_parts = re.split('(' + n + ')', user)
all_parts.append(e[at_ind:])
strs = ["<wb>" + s + "</wb>" for s in all_parts if s != '']
if len(strs) > 0:
final = ''.join(strs)
if not final in finals:
finals.append(final)
print finals