对于第一个特征,可以训练基于字符的n-gram语言模型,并将每个字符平均概率较低的所有名称视为可疑。
下面是这种语言模型的一个快速而肮脏的例子。它是1-gram、2-gram和3-gram语言模型的混合体,在一个棕色的语料库上进行训练。我相信你能找到更多相关的培训数据(如所有演员名单)。
from nltk.corpus import brown
from collections import Counter
import numpy as np
text = '\n'.join([' '.join([w for w in s]) for s in brown.sents()])
unigrams = Counter(text)
bigrams = Counter(text[i:(i+2)] for i in range(len(text)-2))
trigrams = Counter(text[i:(i+3)] for i in range(len(text)-3))
weights = [0.001, 0.01, 0.989]
def strangeness(text):
r = 0
text = ' ' + text + '\n'
for i in range(2, len(text)):
char = text[i]
context1 = text[(i-1):i]
context2 = text[(i-2):i]
num = unigrams[char] * weights[0] + bigrams[context1+char] * weights[1] + trigrams[context2+char] * weights[2]
den = sum(unigrams.values()) * weights[0] + unigrams[char] + weights[1] + bigrams[context1] * weights[2]
r -= np.log(num / den)
return r / (len(text) - 2)
现在你可以把这种奇怪的方法应用到你的例子中。
t1 = '128, 127, h4rugz4sx383a6n64hpo, tt, t66, t65, asdfds'.split(', ')
t2 = 'Michael, sara, jose colmenares, Dimitar, Jose Rafael, Morgan, Eduardo Medina, Luis R. Mendez, Hikaru, SELENIA, Zhang Ming, Xuting Liu, Chen Zheng'.split(', ')
for t in t1 + t2:
print('{:20} -> {:9.5}'.format(t, strangeness(t)))
你看,在大多数情况下,乱七八糟的名字比普通名字更“奇怪”。例如,这里可以使用5.9的阈值。
128 -> 5.9073
127 -> 6.0044
h4rugz4sx383a6n64hpo -> 7.4261
tt -> 6.3916
t66 -> 7.3553
t65 -> 7.2584
asdfds -> 6.1796
Michael -> 5.6694
sara -> 5.5734
jose colmenares -> 4.9489
Dimitar -> 5.7058
Jose Rafael -> 5.8184
Morgan -> 5.5766
Eduardo Medina -> 5.5703
Luis R. Mendez -> 5.5337
Hikaru -> 6.439
SELENIA -> 7.1125
Zhang Ming -> 5.1594
Xuting Liu -> 5.5975
Chen Zheng -> 5.3341
当然,一个更简单的解决方案是收集所有目标语言中流行名称的列表,并且完全不使用机器学习——只使用查找。