2016-07-01 27 views
0

Ich versuche, kürzeste Wege zwischen allen Paaren von Substantiven in einer Gruppe zu berechnen. Ich habe viele solcher Gruppen von Substantiven mit verschiedenen Gruppengrößen. Die größte Gruppe enthält ungefähr 250 Nomen. Die Eingabe ist eine TXT-Datei mit Substantiven, jeweils in einer neuen Zeile. Die Ausgabe als txt-Datei sollte alle Paare von Substantiven mit entsprechenden kürzesten Wegen auflisten.Wie berechnet man kürzeste Wege zwischen allen Nomenpaaren in einer Gruppe mit NLTK, WordNet und Ähnlichkeit?

Ich bin neu in Python und NLTK, und nach viel suchen hier und anderen Quellen, viele Versuche und Fehler, dies ist der Code, den ich kam:

import nltk 
from nltk.corpus import wordnet as wn 

listSim = [] 
with open("words-input.txt", "rU") as wordList1: 
    myList1 = [line.rstrip('\n') for line in wordList1] 
    for word1 in myList1: 
     with open("words-input2.txt", "rU") as wordList2: 
      myList2 = [line.rstrip('\n') for line in wordList2] 
      for word2 in myList2: 
       wordFromList1 = wn.synsets(word1) 
       wordFromList2 = wn.synsets(word2) 
       if wordFromList1 and wordFromList2: 
        s = 1/(wordFromList1[0].path_similarity(wordFromList2[0])) 
        sym = (word1, word2, s) 
        listSim.append(sym) 

print (listSim) 
with open("words-output.txt", "w") as text_file: 
    print (listSim, file=text_file) 

(Just, bemerken, ich konnte nicht erfolgreich die gleiche txt-Datei durchlaufen, so habe ich eine doppelte, und die Worte ‚-input.txt‘ und die gleiche Gruppe von Substantiven in der gleichen Reihenfolge enthalten in dem obigen Code ‚Wörter-input2.txt‘.)

Das Problem mit meinem Code ist, dass es nur den kürzesten Weg zwischen den ersten Synsets (erste Bedeutung - n # 1) der Substantive berechnet. Wenn zum Beispiel der kürzeste Pfad zwischen n # 3 von Nomen1 und N # 5 von Nomen2 zu sein scheint, ist dies die Zahl, die ich ausgeben muss (oder reziprok, die Anzahl der Schritte auf diesem Pfad).

Hilfe oder Ratschläge, wie dies zu tun, wird sehr geschätzt.

Antwort

3

Folgendes sollte für Sie tun, ich die relevanten Teile nur zur Verfügung stellen.

from itertools import product 

for word1 in myList1: 
    for word2 in myList2: 
     list1 = wn.synsets(word1) 
     list2 = wn.synsets(word2) 

     sList = [ss1.path_similarity(ss2) for ss1, ss2 in product(list1, list2)] 

     best = sorted(sList, reverse=True)[0] 
     listSim.append((word1, word2, best)) 
+0

Danke für die Antwort! Ich hatte zusätzliches Problem mit "None" in sList oben, aber Ihr Code arbeitete mit der folgenden Änderung: von Operator importieren is_not von functools Import Teil sListFilter = Filter (teilweise (is_not, keine), sList) – Georgi

+0

Froh, dass ich geholfen habe. Ich bin mir nicht sicher warum du Probleme mit None hast - wenn 'list1' oder' list2' leer sind, wird die Produktliste (und damit auch 'sList') ebenfalls leer, also solltest du" index out of "haben Bereich "in der Linie, die am besten ist". Sowieso :) – dkar