如何确定随机字符串听起来像英语?
nlp
5
0

我有一种算法,可根据输入单词列表生成字符串。如何仅将听起来像英语单词的字符串分开?即。保留耶和华的同时丢弃RDLO

编辑:为澄清起见,它们不必是词典中的实际单词。他们只需要听起来像英语。例如, KEAL将被接受。

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

您可以通过将候选字符串标记为字母 (成对的相邻字母)并根据英语双字母组频率表检查每个双字母组来实现。

  • 很简单:如果频率表上的任何二元组足够低(或根本不存在),则认为该字符串不合理。 (字符串包含一个“ QZ”双字?拒绝!)
  • 不太简单:用每个二元组的频率除以该长度的有效英语字符串的平均频率的乘积来计算整个字符串的总体合理性。这样一来,您既可以(a)接受一个带有奇数个低频二元组的字符串,也可以接受一个(b)拒绝一个包含几个单独的低但不完全低于阈值二元组的字符串。

这两种方法都需要对阈值进行一些调整,第二种技术要比第一种更加。

使用三字组合做同样的事情可能会更健壮,尽管这也可能导致一组更为严格的“有效”字符串。是否获胜取决于您的应用程序。

基于现有研究语料库的Bigram和Trigram表可能是免费提供或购买的(到目前为止,我没有免费提供,但只有一个粗略的google可用),但是您可以从自己的任何商品中计算出Bigram或Trigram表,大小的英文文本语料库。只需将每个单词作为标记进行曲柄处理,然后将每个双字母组合起来即可-您可以将其作为哈希处理,以给定的双字母组合作为键,并使用递增的整数计数器作为值。

英语形态和英语语音学(著名!)比等轴测少,因此,该技术很可能会生成“看起来”英语但出现麻烦发音的字符串。这是三元组而不是二元组的另一个论点—如果n-gram跨越整个声音,则通过分析依次使用多个字母来产生给定音素的声音而产生的怪异感将会减少。 (例如,以“低谷”或“海啸”为例。)

收藏
评论

您应该研究“可发音的”密码生成器,因为它们试图完成相同的任务。

Perl解决方案是Crypt :: PassGen ,您可以使用字典对其进行训练(因此,如果需要,可以将其训练为多种语言)。它遍历字典并收集有关1、2和3个字母的序列的统计信息,然后根据相对频率构建新的“单词”。

收藏
评论

MetaphoneDouble Metaphone与SOUNDEX相似,不同之处在于它们可能比SOUNDEX更适合您的目标。他们被设计为根据其语音“声音”来“散列”单词,并且擅长使用英语(但不是那么多其他语言和专有名称)。

所有这三种算法要记住的一件事是,它们对单词的第一个字母极为敏感。例如,如果您想弄清楚KEAL是否是英语,您将找不到与REAL匹配的字母,因为首字母不同。

收藏
评论

贝叶斯过滤器的简单方法(来自http://sebsauvage.net/python/snyppets/#bayesian的 Python示例)

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]
收藏
评论

使用马尔可夫链生成英语发音的单词很容易。但是,倒退更具挑战性。结果的可接受误差范围是多少?您总是可以找到常用字母对,三重字母等的列表,然后根据这些字母对它们进行评分。

收藏
评论

您可以构建庞大的英文文本的马尔可夫链。

之后,您可以将单词输入到markov链中,并检查单词是英语的可能性有多高。

参见此处: http : //en.wikipedia.org/wiki/Markov_chain

在页面底部,您可以看到markov文本生成器。您想要的恰恰相反。

简而言之:markov链为每个字符存储下一个字符将跟随的概率。如果您有足够的内存,可以将此想法扩展为两个或三个字符。

收藏
评论

我很想在英语单词的字典上运行soundex算法并缓存结果,然后soundex您的候选字符串并与缓存匹配。

根据性能要求,您可以为soundex代码制定距离算法,并接受具有一定公差的字符串。

Soundex非常易于实现-有关该算法的说明,请参阅Wikipedia

您要执行的操作的示例实现为:

def soundex(name, len=4):
    digits = '01230120022455012623010202'
    sndx = ''
    fc = ''

    for c in name.upper():
        if c.isalpha():
            if not fc: fc = c
            d = digits[ord(c)-ord('A')]
            if not sndx or (d != sndx[-1]):
                sndx += d

    sndx = fc + sndx[1:]
    sndx = sndx.replace('0','')
    return (sndx + (len * '0'))[:len]

real_words = load_english_dictionary()
soundex_cache = [ soundex(word) for word in real_words ]

if soundex(candidate) in soundex_cache:
    print "keep"
else:
    print "discard"

显然,您需要提供read_english_dictionary的实现。

编辑 :您的“ KEAL”示例将很好,因为它与“ KEEL”具有相同的soundex代码(K400)。如果您想了解失败率,可能需要记录被拒绝的单词并手动验证它们。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号