Я использую алгоритм LESK для получения SynSets из текста. Но у меня разные результаты с теми же входами. Является ли это алгоритмом Леска «особенностью», или я что-то делаю неправильно? Далее идет код, я использую:NLTK. Леск возвращает другой результат для того же входа
self.SynSets =[]
sentences = sent_tokenize("Python is a widely used general-purpose, high-level programming language.\
Its design philosophy emphasizes code readability, and its syntax allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java.\
The language provides constructs intended to enable clear programs on both a small and large scale.\
Python supports multiple programming paradigms, including object-oriented, imperative and functional programming or procedural styles.\
")
stopwordsList = stopwords.words('english')
self.sentNum=0;
for sentence in sentences:
raw_tokens = word_tokenize(sentence)
final_tokens = [token.lower() for token in raw_tokens
if(not token in stopwordsList)
#and (len(token) > 3)
and not token.isdigit()]
for token in final_tokens:
synset = wsd.lesk(sentence, token)
if not synset is None:
self.SynSets.append(synset)
self.SynSets = set(self.SynSets)
self.WriteSynSets()
return self
На выходе я имеющий результаты (первые 3 результатов от 2-х различного запуска):
Synset('allow.v.09') Synset('code.n.03') Synset('coffee.n.01')
------------
Synset('allow.v.09') Synset('argumentation.n.02') Synset('boastfully.r.01')
Если есть другой (более стабильный), чтобы получить synsets, я буду благодарен за вашу помощь.
Заранее спасибо.
Edited
Для дополнительного примера здесь есть полный сценарий, который я баллотировался в 2 раза:
import nltk
from nltk.tokenize import sent_tokenize
from nltk import word_tokenize
from nltk import wsd
from nltk.corpus import stopwords
SynSets =[]
sentences = sent_tokenize("Python is a widely used general-purpose, high-level programming language.\
Its design philosophy emphasizes code readability, and its syntax allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java.\
The language provides constructs intended to enable clear programs on both a small and large scale.\
Python supports multiple programming paradigms, including object-oriented, imperative and functional programming or procedural styles.\
")
stopwordsList = stopwords.words('english')
for sentence in sentences:
raw_tokens = word_tokenize(sentence)#WordPunctTokenizer().tokenize(sentence)
#removing stopwords and words, smaller than 3 characters
final_tokens = [token.lower() for token in raw_tokens
if(not token in stopwordsList)
#and (len(token) > 3)
and not token.isdigit()]
for token in final_tokens:
synset = wsd.lesk(sentence, token)
if not synset is None:
SynSets.append(synset)
SynSets = set(SynSets)
SynSets = sorted(SynSets)
with open("synsets.txt", "a") as file:
file.write("\n-------------------\n")
for synset in SynSets:
file.write("{} ".format(str(synset.__str__())))
file.close()
и у меня были эти результаты (первые 4 привели synsets, что было написано в файл для каждой из 2-х раз в то время, когда я запускал программу):
Synset ('allow.v.04') Synset ('boas tfully.r.01 ') Synset (' clear.v.11 ') Synset (' code.n.02 ')
Synset (' boastfully.r.01 ') Synset (' clear.v.19) ') Synset (' code.n.01 ') Synset (' design.n.04')
РЕШЕНИЕ: Я получил то, что была проблема. После повторной установки python 2.7 все проблемы ушли. Итак, не используйте python 3.x с алгоритмом lesk.
У меня установлен NLTK 3.0.1. И я использую wsd.lesk от NLTK. Probem - это другой результат в выходе. У вас была аналогичная проблема? Для pywsd - спасибо. Я попробую – MisterMe
Вы это правильно называете? Когда я запускаю его 10 раз, нет ничего другого. Как вы назвали леск из НЛТК? – alvas
У меня есть разница, когда я перезапускаю программу. Вы можете увидеть, как я из usin lesk из примера. – MisterMe