首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Python检测乱码名称

无法使用Python检测乱码名称
EN

Stack Overflow用户
提问于 2018-06-03 02:21:58
回答 1查看 1.3K关注 0票数 0

我正在尝试构建Python模型,该模型可以将帐户名称分类为合法或胡言乱语。在这种情况下,大小写并不重要,因为一些合法的帐户名称可能全部由大写字母组成,也可能全部由小写字母组成。

免责声明:这只是一项内部研究/实验,不会对分类器结果采取任何实际行动。

就我个人而言,有两个可能的特征可以显示帐户名称可疑、胡言乱语或两者兼而有之:

  1. 名称或名称中的奇怪/随机拼写由纯数字或大部分数字组成。符合这些条件的帐户名称的示例有: asdfds.
  2. The 128、127、h4rugz4sx383a6n64hpo、tt、t66、t65、 name有两个组成部分(让我们假设任何名称都不会有超过两个组成部分),并且这两个组成部分的拼写和发音非常相似。符合这些条件的帐户名称的示例有: Faja Jala Haja、 Yaha、Faja Kaja.

如果帐户名称同时满足上述两个条件(即“asdfs lsdfs”、“332 333”),则也应将其视为可疑。

另一方面,合法的帐户名不需要名字和姓氏都有。它们通常是来自流行语言的名称,例如罗马/拉丁语(即西班牙语、德语、葡萄牙语、法语、英语)、汉语和日语。

合法帐户名的例子包括(这些名称是虚构的,但反映了真实世界中类似样式的合法帐户名):Michael、sara、Jose colmenares、Dimitar、jose Rafael、Morgan、Eduardo Medina、LuisR.Mendez、Hikaru、SELENIA、张铭、刘绪庭、陈征。

我在Stackoverflow上看到过一些稍微类似的问题,询问如何检测胡言乱语的文本。但这些并不适合我的情况,因为合法的文本和单词实际上是有含义的,而人名通常没有意义。我也希望能够只基于帐户名,而不是其他任何东西。

现在,我的脚本使用Python的Fuzzy包并使用50%作为相似度阈值来查找可疑帐户名的第二个特征(名称中相似的组件)。脚本如下所示:

代码语言:javascript
复制
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

import pandas as pd
import numpy as np

accounts = pd.read_csv('dataset_with_names.csv', encoding = 'ISO-8859-1', sep=None, engine='python').replace(np.nan, 'blank', regex=True)

pd.options.mode.chained_assignment = None

accounts.columns = ['name', 'email', 'akon_id', 'acct_creation_date', 'first_time_city', 'first_time_ip', 'label']

accounts['name_simplified']=accounts['name'].str.replace('[^\w\s]','')
accounts['name_simplified']=accounts['name_simplified'].str.lower()

sim_name = []

for index, row in accounts.iterrows():        
    if ' ' in row['name_simplified']:
        row['name_simplified']=row['name_simplified'].split()
        if len(row['name_simplified']) > 1:
            #print(row['name_simplified'])
            if fuzz.ratio(row['name_simplified'][0], row['name_simplified'][1]) >= 50:
                sim_name.append('True')
            else:
                sim_name.append('False')
        else:
            sim_name.append('False')
    else:
        sim_name.append('False')        

accounts['are_name_components_similar'] = sim_name 

结果对于脚本设计的目的是可靠的,但我也希望能够用第一个特征(奇怪/随机拼写或名称由纯数字或大部分数字组成)浮出胡言乱语的帐户名。到目前为止,我还没有找到解决方案。

有人能帮上忙吗?任何反馈/建议都将非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 05:40:01

对于第一个特征,您可以训练基于字符的n-gram语言模型,并将每个字符的平均概率较低的所有名称视为可疑名称。

下面是这种语言模型的一个简单示例。它是1-gram,2-gram和3-gram语言模型的混合,在Brown语料库上训练。我相信你可以找到更多相关的训练数据(例如所有演员的名单)。

代码语言:javascript
复制
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[context1] * weights[1] + bigrams[context2] * weights[2]
        r -= np.log(num / den)
    return r / (len(text) - 2)

现在,您可以将此陌生性度量应用到示例中。

代码语言:javascript
复制
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)))

你可以看到,在大多数情况下,胡言乱语的名字比正常的名字更“奇怪”。例如,您可以在此处使用阈值3.9。

代码语言:javascript
复制
128                  ->    5.5528
127                  ->    5.6572
h4rugz4sx383a6n64hpo ->    5.9016
tt                   ->    4.9392
t66                  ->    6.9673
t65                  ->    6.8501
asdfds               ->    3.9776
Michael              ->    3.3598
sara                 ->    3.8171
jose colmenares      ->    2.9539
Dimitar              ->    3.4602
Jose Rafael          ->    3.4604
Morgan               ->    3.3628
Eduardo Medina       ->    3.2586
Luis R. Mendez       ->     3.566
Hikaru               ->    3.8936
SELENIA              ->    6.1829
Zhang Ming           ->    3.4809
Xuting Liu           ->    3.7161
Chen Zheng           ->    3.6212

当然,更简单的解决方案是收集所有目标语言的常用名称列表,并且根本不使用机器学习-只使用查找。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50659889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档