2013-01-23 4 views
6

Ich versuche, ein Python-Skript zu entwickeln, um jeden Satz in Barack Obamas zweite Antrittsrede zu untersuchen und ähnliche Sätze in früheren Einweihungen zu finden. Ich habe ein sehr grobes Fuzzy-Match entwickelt, und ich hoffe, es zu verbessern.erkennen Anspielungen (z. B. sehr unscharfe Übereinstimmungen) in der Sprache der Eröffnungsansprachen

Ich fange an, indem ich alle Anerkennungen auf Listen von stopword-freien Sätzen reduziere. Ich baue dann einen Frequenzindex auf.

Als nächst ich jeden Satz in Obamas 2013-Adresse zu jedem Satz von jeder anderen Adresse zu vergleichen und zu bewerten die Ähnlichkeit wie so:

#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) 

Last, ich Ergebnisse herauszufiltern basierend auf beliebige Cutoffs für n und c .

Es funktioniert besser, als man vielleicht denken könnte, Sätze zu identifizieren, die unübliche Wörter in einem nicht vernachlässigbaren Anteil an Gesamtwörtern teilen.

Zum Beispiel nahm sie diese Spiele bis:


Obama, 2013: Denn die Geschichte sagt uns, dass, während diese Wahrheiten für selbstverständlich sein mögen, sie haben nie selbst ausführt; Während Freiheit ein Geschenk Gottes ist, muss sie von Seinen Menschen hier auf der Erde gesichert werden.

Kennedy, 1961: Mit gutem Gewissen unsere einzige sichere Belohnung, mit der Geschichte der letzte Richter unserer Taten, lassen Sie uns gehen weiter das Land, das wir lieben, zu führen, seinen Segen und seine Hilfe zu bitten, aber zu wissen, dass Hier auf der Erde muss Gottes Werk wirklich unser eigenes sein.


Obama 2013 Durch Blut von Peitsche und Blut durch das Schwert gezogen gezogen, haben wir gelernt, dass keine Vereinigung auf den Prinzipien der Freiheit und Gleichheit gegründet könnte halb Sklaven und halbfreien überleben.

Lincoln 1861 Doch wenn Gott will, dass es durch die bondsman der 250 Jahre der unerfüllten Arbeit angehäuft, bis die gesamte Vermögen weiterhin soll versenkt werden, und bis jedem Tropfen Blut mit der Peitsche gezogen wird seine wie von einem anderen bezahlt mit dem Schwert gezogen, vor dreitausend Jahren gesagt wurde, so noch muss sie „die Urteile des Herren gesagt werden, wahr sind und allesamt gerecht.


Obama 2013 Diese Generation von Amerikaner wurden durch Krisen getestet, die unsere Entschlossenheit bestärkten und bewiesen unsere Widerstandsfähigkeit

Kennedy 1961 Da dieses Land gegründet wurde, jede Generation von Amerikanern ist Zeugnis für ihre nationale Loyalität geben gerufen.


Aber es ist sehr roh.

Ich habe nicht die Koteletts für ein größeres maschinelles Lernprojekt, aber ich möchte wenn möglich mehr Theorie anwenden.Ich verstehe Bigramm-Suche, aber ich bin mir nicht sicher, ob das hier funktionieren wird - es sind nicht so sehr genaue Bigrams, an denen wir interessiert sind, wie die allgemeine Nähe von zwei Wörtern, die zwischen Anführungszeichen geteilt werden. Gibt es einen unscharfen Satzvergleich, der Wahrscheinlichkeit und Verteilung von Wörtern betrachtet, ohne zu starr zu sein? Die Natur der Anspielung ist, dass es sehr ungefähr ist.

Aktuelle Anstrengung available on Cloud9IDE

UPDATE 1/24/13 Pro die akzeptierte Antwort, hier ist eine einfache Python-Funktion für Bigramm Fenster:

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 

Antwort

2

Wenn Sie inspiriert sind Bigrams zu verwenden, Sie könnten Ihre Bigramme bauen, während Sie Lücken von einem, zwei oder sogar drei Wörtern zulassen, um die Definition von Bigram ein wenig zu lockern. Dies könnte funktionieren, da n Lücken bedeutet nicht einmal n mal so viele "Bigramme", und Ihr Korpus ist ziemlich klein. Damit könnte zum Beispiel ein "Bigramm" aus Ihrem ersten Absatz (similar, inaugurals) sein.

+0

Ja, das wäre die nächste Richtung, in die ich auch gehen würde. Worüber er spricht, sind Kollokationsfenster; schau in sie hinein. Im Grunde definieren Sie ein gleitendes Fenster und sammeln Bigramme aus jedem Wortpaar innerhalb: "Diese Generation von Amerikanern wurde getestet": diese Generation, diese, diese Amerikaner ... Generation, Generation Amerikaner, Generation hat. .. und so weiter. – verbsintransit

+0

Das hat mich viel näher gebracht, danke! Wird den Bigramm-Fenstercode anhängen (obwohl es ziemlich offensichtlich ist). –

Verwandte Themen