用就职地址的语言检测典故(例如非常模糊的匹配)

时间:2013-01-23 23:29:55

标签: python text nlp nltk

我正在尝试开发一个Python脚本,以检查巴拉克奥巴马的第二个就职演说中的每一句话,并在过去的就职典礼中找到类似的句子。我已经开发了一个非常粗糙的模糊匹配,我希望能够改进它。

我首先将所有就职典礼减少为免费减刑句。然后我建立一个频率指数。

接下来,我将奥巴马2013年地址中的每个句子与每个其他地址的每个句子进行比较,并像这样评估相似性:

#compare two lemmatized sentences. Assumes stop words already removed. frequencies is dict of frequencies across all inaugural    
def compare(sentA, sentB, frequencies):
    intersect = [x for x in sentA if x in sentB]
    N = [frequencies[x] for x in intersect]
    #calculate sum that weights uncommon words based on frequency inaugurals
    n = sum([10.0 / (x + 1) for x in N])
    #ratio of matches to total words in both sentences. (John Adams and William Harrison both favored loooooong sentences that tend to produce matches by sheer probability.)
    c = float(len(intersect)) / (len(sentA) + len(sentB))
    return (intersect, N, n, c)

最后,我根据n和c的任意截止值过滤掉结果。

它比人们想象的更好,识别与总词数不可忽略的比例共享不常见词语的句子。

例如,它选择了这些匹配项:


奥巴马,2013年: 因为历史告诉我们,虽然这些真理可能是不言而喻的,但它们从来都不是自我执行的;虽然自由是上帝的恩赐,但必须由地球上的人民来保障。

肯尼迪,1961年: 凭着良心,我们唯一肯定的奖赏,历史作为我们行为的最终判断,让我们出去领导我们所爱的土地,求他的祝福和他的帮助,但要知道在这里,上帝的工作必须真正属于我们自己。


奥巴马,2013年 通过鞭子抽血和剑吸血,我们了解到,任何建立在自由和平等原则基础上的联盟都不能生存半奴隶和半自由。

林肯,1861年 然而,如果上帝希望它继续下去,直到债券人的二百五十年无偿劳动所堆积的所有财富都将沉没,直到用鞭子吸取的每一滴血都要由另一个用剑绘制的血来支付,就像三千年前说过,所以仍然必须说“耶和华的审判完全是正义的。


奥巴马,2013年 这一代美国人已经受到危机的考验,这些危机激发了我们的决心并证明了我们的韧性

肯尼迪,1961年 自这个国家成立以来,每一代美国人都被召集来证明其国家忠诚。


但它非常粗糙。

我没有主要的机器学习项目,但我确实希望在可能的情况下应用更多的理论。我理解二元搜索,但我不确定它是否会在这里起作用 - 我们感兴趣的不是那么精确的双字母作为引号之间共享的两个单词的普遍接近。是否有一个模糊的句子比较,它会查看单词的概率和分布,而不会过于刻板?典故的本质是它非常近似。

目前的努力available on Cloud9IDE

更新,2013年1月24日 根据接受的答案,这是一个用于bigram窗口的简单Python函数:

def bigrams(tokens, blur=1):
    grams = []
    for c in range(len(tokens) - 1):
        for i in range(c + 1, min(c + blur + 1, len(tokens))):
            grams.append((tokens[c], tokens[i]))
    return grams

1 个答案:

答案 0 :(得分:2)

如果你受到使用双字母的启发,你可以构建你的双字母组合,同时允许一个,两个甚至三个单词的间隙,以便稍微放松对双字母的定义。这可能有效,因为允许 n 间隙意味着甚至 n 都不会像“bigrams”一样多,并且您的语料库非常小。有了这个,例如,你的第一段中的“二元组”可以是(similar, inaugurals)