2015-06-02 7 views
5

Ich arbeite mit der Python NLTK Wordnet API. Ich versuche das beste Synset zu finden, das eine Gruppe von Wörtern repräsentiert.NLTK Wordnet Synset für Wortgruppe

Wenn ich das beste Synset für etwas wie "Schule & Bürobedarf" finden muss, bin ich mir nicht sicher, wie man das macht. Bisher habe ich versucht, die Synsets für die einzelnen Worte zu finden und dann die Berechnung der besten kleinsten gemeinsamen hypernym wie folgt aus:

def find_best_synset(category_name): 
    text = word_tokenize(category_name) 
    tags = pos_tag(text) 

    node_synsets = [] 
    for word, tag in tags: 
     pos = get_wordnet_pos(tag) 
     if not pos: 
      continue 
     node_synsets.append(wordnet.synsets(word, pos=pos)) 

    max_score = 0 
    max_synset = None 
    max_combination = None 
    for combination in itertools.product(*node_synsets): 
     for test in itertools.combinations(combination, 2): 
      score = wordnet.path_similarity(test[0], test[1]) 
      if score > max_score: 
       max_score = score 
       max_combination = test 
       max_synset = test[0].lowest_common_hypernyms(test[1]) 
    return max_synset 

Dies gilt jedoch nicht sehr gut funktionieren und es ist sehr teuer. Gibt es Möglichkeiten, herauszufinden, welches Synset mehrere Wörter am besten repräsentiert?

Danke für Ihre Hilfe!

+0

Wenn alle Ihre Ausdrücke wie dieses Beispiel sind, dann sollten Sie wahrscheinlich nicht nach einem gemeinsamen Hyperonym suchen. "Schulbedarf" ist eine Art von Vorräten, aber sie sind keine Schule. Man könnte vielmehr die Synsets des letzten Wortes betrachten und zwischen denen diskriminieren, die die vorhergehenden Wörter verwenden (ich weiß jedoch nicht, wie ich das machen soll). – lenz

+0

Hmmm, ich sehe deinen Punkt, aber ich denke nicht, dass alle Ausdrücke wie dieses Beispiel sind. Ich weiß, dass "Schule und Büro" die Art von Lieferungen sind, aber sie werden immer noch als Substantive statt als Adjektive anerkannt. –

+0

Nun, es wird Ihre Aufgabe nicht vereinfachen, wenn die Ausdrücke unterschiedliche interne Strukturen haben. Ich schlage vor, dass Sie manuell das korrekte Synset in einer Stichprobe zuweisen (wie 20 zu Beginn) und dann schauen, ob Sie ein Muster sehen können. Oder manuell noch mehr Instanzen und einen Entscheidungsbaum trainieren. – lenz

Antwort

4

Abgesehen von dem, was ich bereits in den Kommentaren gesagt habe, denke ich, dass die Art, wie Sie das beste Hyperonym auswählen, fehlerhaft sein könnte. Das Synset, mit dem Sie enden, ist nicht das niedrigste allgemeine Hyperonym von allen Wörtern, sondern nur das von zweien von ihnen.

Lassen Sie uns bei Ihrem Beispiel von "Schule & Bürobedarf" bleiben. Für jedes Wort im Ausdruck erhalten Sie eine Anzahl von Synsets. So wird die Variable node_synsets in etwa wie folgt aussehen:

[[school_1, school_2], [office_1, office_2, office_3], [supply_1]] 

In diesem Beispiel gibt es sechs Möglichkeiten, um jedes Synset mit einem der anderen zu kombinieren:

[(school_1, office_1, supply_1), 
(school_1, office_2, supply_1), 
(school_1, office_3, supply_1), 
(school_2, office_1, supply_1), 
(school_2, office_2, supply_1), 
(school_2, office_3, supply_1)] 

Diese Tripel sind, was Sie iterieren in der äußeren for Schleife (mit itertools.product). Wenn der Ausdruck 4 Wörter hat, würden Sie über Quadrupel iterieren, mit 5 ist es Fünffach usw.

Jetzt, mit der inneren for Schleife, paaren Sie jedes Triple ab. Die erste ist:

[(school_1, office_1), 
(school_1, supply_1), 
(office_1, supply_1)] 

... und Sie bestimmen den niedrigsten Hyperonym unter jedem Paar. So erhalten Sie am Ende den niedrigsten Hyperonym von, sagen wir, school_2 und office_1, die eine Art Institution sein könnte. Dies ist wahrscheinlich nicht sehr sinnvoll, da es kein Synset des letzten Wortes berücksichtigt.

Vielleicht sollten Sie versuchen, den niedrigsten gemeinsamen Hyperonym von alle drei Wörter in jeder Kombination ihrer Synsets zu finden, und nehmen Sie die eine Bewertung am besten unter ihnen.

+0

Ich stimme zu, ich habe versucht, das in einer späteren Iteration zu tun. Die Lösung, die ich letztendlich verwendete, bestand darin, diese nicht auf einen einzelnen Hypernym zu reduzieren, sondern stattdessen alle erzeugten Synsets zu verwenden, um die beste Punktzahl zu erhalten. Ziemlich viel Rückkehr "node_synsets" und die Verwendung von. Wenn ich den LCH für alle drei finden möchte ... würde ich es zwischen zwei von ihnen finden und dann das in einer LCH-Berechnung mit dem dritten verwenden? –

+0

würde ich ja sagen, ja. – lenz

Verwandte Themen