Chr*_*son 6 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)
Run Code Online (Sandbox Code Playgroud)
最后,我根据n和c的任意截止值过滤掉结果.
它比人们想象的更好,识别与总词数不可忽略的比例共享不常见词语的句子.
例如,它选择了这些匹配:
奥巴马,2013年: 历史告诉我们,虽然这些真理可能是不言而喻的,但它们从来都不是自我执行的; 虽然自由是上帝的礼物,但它必须由地球上的人民来保护.
肯尼迪,1961年: 凭着良心,我们唯一肯定的奖赏,历史是我们行为的最终判断,让我们出去领导我们所爱的土地,求他的祝福和他的帮助,但要知道在这里,上帝的工作必须真正做我们自己的.
奥巴马,2013年 通过鞭子和剑吸血所吸引的血液,我们了解到,建立在自由和平等原则基础上的任何联盟都不能生存半奴隶和半自由.
林肯,1861年 然而,如果上帝愿意继续下去,直到债券人二百五十年无偿劳动所堆积的所有财富都将沉没,直到用鞭子吸取的每一滴血都要由另一个用剑绘制的血来支付正如三千年前所说的那样,仍然必须说"耶和华的审判完全是正义的.
奥巴马,2013年 这一代美国人已经受到危机的考验,这些危机使我们的决心更加坚定,并证明了我们的韧性
肯尼迪,1961年 自这个国家成立以来,每一代美国人都被召集来证明其国家的忠诚度.
但它非常粗糙.
我没有主要的机器学习项目,但我确实希望在可能的情况下应用更多的理论.我理解二元搜索,但我不确定它是否会在这里起作用 - 我们感兴趣的不是那么精确的双字母作为引号之间共享的两个单词的普遍接近.是否有一个模糊的句子比较,它会查看单词的概率和分布,而不会过于刻板?典故的本质是它非常近似.
更新,1/24/13 根据接受的答案,这里是一个简单的Python函数用于bigram窗口:
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
Run Code Online (Sandbox Code Playgroud)
如果您受到启发使用二元组,您可以构建您的二元组,同时允许一个、两个甚至三个单词的间隙,以便稍微放宽二元组的定义。这可能会起作用,因为允许n 个间隙意味着甚至不会有n倍的“二元组”,而且你的语料库非常小。例如,这样,第一段中的“二元组”可能是(similar, inaugurals)。
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |