6

私は、バラク・オバマの 2 番目の就任演説のすべての文を調べ、過去の就任演説で同様の文を見つける 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年 しかし、神が望むなら、保税人が250年間報われない労苦によって積み上げられたすべての富が沈み、むちで抜かれた一滴の血が剣で抜かれた別の人によって支払われるまで、それが続くことを望むなら、 3000年前に言われたように、今でも「主の裁きは真実であり、すべて正しい」と言わなければなりません。


オバマ、2013年 この世代のアメリカ人は、私たちの決意を固め、私たちの回復力を証明した危機によって試されてきました

ケネディ、1961 年 この国が建国されて以来、各世代のアメリカ人は、国家への忠誠を証明するために召喚されてきました。


しかし、それは非常に粗雑です。

大規模な機械学習プロジェクトをこなせるほどの才能はありませんが、可能であれば理論をもっと応用したいと思っています。私はバイグラム検索を理解していますが、ここでうまくいくかどうかはわかりません.引用符間で共有される2つの単語の一般的な近接性として、私たちが興味を持っているのは正確なバイグラムではありません. 厳格になりすぎずに単語の確率と分布を調べるあいまいな文の比較はありますか? ほのめかしの性質は、それが非常に近似的であることです。

Cloud9IDE で利用可能な現在の取り組み

UPDATE、 1/24/13 受け入れられた回答によると、バイグラムウィンドウ用の単純な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

バイグラムを使用することに着想を得た場合は、バイグラムの定義を少し緩めるために、1、2、または 3 語のギャップを許容しながらバイグラムを構築できます。n個のギャップを許可することは、「バイグラム」のn倍にもならないことを意味し、コーパスはかなり小さいため、これはうまくいく可能性があります。これにより、たとえば、最初の段落の「バイグラム」は(similar, inaugurals).

于 2013-01-24T00:14:28.593 に答える