2016-07-01 10 views
0

그룹의 모든 명사 쌍 사이의 최단 경로를 계산하려고합니다. 나는 그룹 크기가 다른 수많은 명사 그룹을 가지고 있습니다. 가장 큰 그룹에는 약 250 개의 명사가 있습니다. 입력은 명사가있는 txt 파일로 각 행은 새로운 행에 있습니다. txt 파일의 출력에는 해당하는 최단 경로가있는 모든 명사 쌍이 나열되어야합니다.NLTK, WordNet 및 유사성이있는 그룹의 모든 명사 쌍 사이의 최단 경로를 계산하는 방법은 무엇입니까?

나는 파이썬과 NLTK에 새로운 오전, 여기에 검색 및 기타 소스, 많은 시행 착오를 많이 후, 이것은 내가 해낸 코드 : 그냥주의하는 것이

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) 

(내가 할 수는 동일한 txt 파일을 성공적으로 반복하지 않으므로 중복을 만들었고 위의 코드에서 'words-input.txt'및 'words-input2.txt'는 동일한 순서로 같은 명사 그룹을 포함합니다.)

내 코드의 문제는 명사의 첫 번째 synsets (첫 번째 의미 -n # 1) 사이의 최단 경로 만 계산한다는 것입니다. 예를 들어, 최단 경로가 명사 1의 n # 3과 명사 2의 n # 5 사이에있는 것으로 보이는 경우, 출력해야하는 번호 (또는이 경로의 단계 수를 나타내는 역수)입니다.

도움말이나 방법을 알려 주시면 대단히 감사하겠습니다.

답변

3

다음 내용은 관련 부분 만 제공합니다.

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

답변 해 주셔서 감사합니다. 위의 sList의 "None"에 대한 추가 문제가 있었지만 코드가 다음과 같이 수정되었습니다. 연산자 가져 오기 from_not functools 가져 오기 partial sListFilter = filter (부분 (is_not, 없음), sList) – Georgi

+0

기꺼이 도와 줬습니다. 왜 'None'에 문제가 있었는지 확실하지 않은 경우 -'list1' 또는'list2'가 비어 있으면 제품 목록 (결과적으로'sList')도 비게됩니다. 그래서 문제는 "index out of 범위 "를 줄 수 있습니다. 어쨌든 :) – dkar