6

我正在尝试开发一个 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 自从这个国家成立以来,每一代美国人都被召集来见证其对国家的忠诚。


但它非常粗糙。

我没有大型机器学习项目的能力,但如果可能的话,我确实想应用更多的理论。我了解二元组搜索,但我不确定这是否会在这里起作用——我们感兴趣的不是精确的二元组,而是引号之间共享的两个单词的普遍接近度。是否有一个模糊的句子比较,它着眼于单词的概率和分布,而不是太死板?典故的本质是它非常近似。

Cloud9IDE 上可用的当前工作

更新,2013 年 1 月 24 日 根据接受的答案,这是一个用于二元窗口的简单 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
4

1 回答 1

2

如果你受到启发使用二元组,你可以建立你的二元组,同时允许一个、两个甚至三个单词的间隙,以便稍微放宽二元组的定义。这可能会起作用,因为允许n 个间隙意味着甚至没有n倍的“bigrams”,而且您的语料库非常小。例如,有了这个,您第一段中的“bigram”可能是(similar, inaugurals).

于 2013-01-24T00:14:28.593 回答