2009-03-22 10 views
0

Das Problem ist wie folgt:Feststellen, ob zwei oder mehr Zusammenfassungen ähnlich sind

ich eine Zusammenfassung, in der Regel zwischen 20 bis 50 Worten, dass ich zu einem anderen relativ ähnlichen Zusammenfassungen vergleichen möchte. Die allgemeine Kategorie und der geografische Standort, auf den sich die Zusammenfassung bezieht, sind bereits bekannt. Wenn zum Beispiel Leute aus der gleichen Gegend über den Bau eines Hauses schreiben, würde ich gerne in der Lage sein, diese Zusammenfassungen mit einiger Sicherheit aufzulisten, dass sie sich tatsächlich auf den Bau von Häusern beziehen, anstatt eine Garage oder ein Gebäude zu bauen Hinterhof Schwimmbad.

Der Datensatz umfasst derzeit etwa 50.000 Dokumente mit einer Wachstumsrate von etwa 200 Dokumenten pro Tag.

Bevorzugte Sprachen wären Python, PHP, C/C++, Haskell oder Erlang, je nachdem, welche Aufgabe erledigt werden könnte. Wenn es Ihnen nichts ausmacht, würde ich gerne die Gründe für die Auswahl einer bestimmten Sprache verstehen.

Antwort

2

Sie können sich die WEBSOM project ansehen.

Obwohl ihre Website in diesem Jahr nicht genau aktualisiert wurde, ist das Problem, das gelöst wird, sehr ähnlich. Da sie Datenmengen verarbeiten, die Ihren Daten (und mehr) ähnlich sind wie vor zehn Jahren, könnten Sie heute die Algorithmen wahrscheinlich fast auf einem Mobiltelefon ausführen.

+0

Wie Sie wahrscheinlich erraten, meine Daten ist meistens auf Finnisch, daher könnte sich dies als sehr relevant erweisen. Ich muss morgen nachdenken. –

1

Es gibt nicht wirklich eine bestimmte Sprache zu wählen. Sie versuchen, semantische Ähnlichkeit zu finden. Dies ist ein sehr großes Gebiet. Sie könnten in diesem Papier interessieren:

Corpus-based and Knowledge-based Measures of Text Semantic Similarity

+0

Ja, ich habe versucht, den semantischen Ansatz zu meiden, weil das Finden von verwandten Begriffen auf Finnisch ein Problem ist, für das ich nicht gerüstet bin. –

4

Sie können versuchen, einige String-Ähnlichkeitsmaße, wie Jaccard und Würfel zu verwenden, aber statt der Berechnung Charakter überlappt, berechnen Sie Wort überlappt. Zum Beispiel mit Python, können Sie Folgendes verwenden:

def word_overlap(a, b): 
    return [x for x in a if x in b] 


def jaccard(a, b, overlap_fn=word_overlap): 
    """ 
    Jaccard coefficient (/\ represents intersection), given by : 
     Jaccard(A, B) = (A /\ B)/(|a|) + (|b|) - (A /\ B) 
    """ 
    c = overlap_fn(a, b) 
    return float(len(c))/(len(a) + len(b) - len(c)) 

jaccard("Selling a beautiful house in California".split(), "Buying a beautiful crip in California".split()) 
4

Da es eine native nette Unterstützung für Sets in Python ist, können wir ändern JGs code wie

def jaccard(a, b): 
    """ 
    Jaccard coefficient (/\ represents intersection), given by : 
     Jaccard(A, B) = (A /\ B)/(|a|) + (|b|) - (A /\ B) 
    """ 
    c = a.intersection(b) 
    return float(len(c))/(len(a) + len(b) - len(c)) 

jaccard(set("Selling a beautiful house in California"), set("Buying a beautiful crip in California")) 
+0

Das ist nicht das gleiche wie JGs Version, er berechnet Jaccard über eine Reihe von Wörtern, und Sie tun es über eine Reihe von Zeichen. Sie können die Funktion weiter vereinfachen, geben Sie einfach float (len (a & b))/len (a | b) zurück. Die Formel im Kommentar ist falsch (die Klammern sind falsch). –

+0

Joaquin, tatsächlich stehe ich korrigiert. Danke, dass du darauf hingewiesen hast. – Chantz

Verwandte Themen