在Python中,我怎么能区分一个可读的词和一个随机的字符串?

2024-04-19 10:13:17 发布

您现在位置:Python中文网/ 问答频道 /正文

单词示例:

  1. 百科全书
  2. 画面

随机字符串示例:

  1. qxbogsac公司
  2. jgaynj公司
  3. rnnfdwpm公司

当然,一个随机字符串实际上可能是某种语言中的一个词或看起来像一个词。但基本上,一个人能够说一些看起来“随机”的东西,基本上只是通过检查你是否能发音。在

我试图计算熵来区分这两者,但这还远远不够完美。你还有其他的想法,算法吗?在

但是有一个重要的要求,我不能使用像nltk这样的重载库或使用字典。基本上,我需要的是一些简单而快速的启发式方法,在大多数情况下都有效。在


Tags: 方法字符串算法语言示例字典公司单词
3条回答

我开发了一个名为Nostril的Python3软件包,用于解决与OP提出的问题密切相关的问题:确定在源代码挖掘过程中提取的文本字符串是类/函数/变量/等标识符还是随机胡言乱语。它不使用字典,但是它包含了一个相当大的n-gram频率表来支持它对文本字符串的概率评估。(我不确定这是否符合“字典”的条件。)这种方法不检查发音,而且它的专门化可能使它不适合一般的单词/非单词检测;然而,也许它对OP或其他想解决类似问题的人有用。在

示例:下面的代码

from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

将产生以下输出:

^{pr2}$

注意事项我不是自然语言专家

假设链接If You Can Raed Tihs, You Msut Be Raelly Smrat中提到的内容是真实的,一个简单的方法是

  1. 有一本英语词典(我相信它的语言是对立的)
  2. 创建单词的python dict,其中键作为字典中单词的第一个和最后一个字符

    words = defaultdict()
    with open("your_dict.txt") as fin:
         for word in fin:
            words[word[0]+word[-1]].append(word)
    
  3. 现在,对于任何给定的单词,搜索字典(记住键是单词的第一个和最后一个字符)

    for matches in words[needle[0] + needle[-1]]:
    
  4. 比较字典和你的针值中的字符是否匹配

    for match in words[needle[0] + needle[-1]]:
        if sorted(match) == sorted(needle):
             print "Human Readable Word"
    

{a2比较慢

如果你真的是说你的随机性指标是可发音性,那么你就进入了phonotactics的领域:语言中允许的发音序列。正如@ChrisPosser在他对你的问题的评论中指出的,这些允许的声音序列是特定于语言的。在

这个问题只有在特定的语言中才有意义。在

无论你选择哪种语言,你可能会有一些运气的n-gram模型训练超过字母本身(相对于单词,这是通常的方法)。然后,您可以计算一个特定字符串的分数,并设置一个阈值,在该阈值下字符串是随机的,超过该阈值的字符串类似于一个单词。在

编辑:已经有人这样做了,并实际实现了:https://stackoverflow.com/a/6298193/583834

相关问题 更多 >