Próbuję utworzyć ogólny synonim identyfikator dla słów w zdaniu, które są znaczące (tj. Nie "a" lub "the") i używam języka naturalnego toolkit (nltk) w pythonie. Problem, który mam, polega na tym, że wyszukiwarka synonimów w nltk wymaga części argumentacji w celu powiązania jej synonimów. Moją próbą rozwiązania tego problemu było użycie uproszczonej części znacznika mowy obecnej w nltk, a następnie zredukowanie pierwszej litery w celu przekazania tego argumentu do wyszukiwarki synonimów, jednak to nie działa.Synonim ogólny i część przetwarzania mowy przy użyciu nltk
def synonyms(Sentence):
Keywords = []
Equivalence = WordNetLemmatizer()
Stemmer = stem.SnowballStemmer('english')
for word in Sentence:
word = Equivalence.lemmatize(word)
words = nltk.word_tokenize(Sentence.lower())
text = nltk.Text(words)
tags = nltk.pos_tag(text)
simplified_tags = [(word, simplify_wsj_tag(tag)) for word, tag in tags]
for tag in simplified_tags:
print tag
grammar_letter = tag[1][0].lower()
if grammar_letter != 'd':
Call = tag[0].strip() + "." + grammar_letter.strip() + ".01"
print Call
Word_Set = wordnet.synset(Call)
paths = Word_Set.lemma_names
for path in paths:
Keywords.append(Stemmer.stem(path))
return Keywords
Jest to kod Obecnie pracuję z, i jak widać jestem pierwszy lemmatizing wejście do zmniejszenia liczby meczów będę mieć w dłuższej perspektywie (Planuję działa to na dziesiątkach tysiące zdań) i teoretycznie chciałbym wyrazić to słowo po tym, aby zwiększyć ten efekt i zmniejszyć liczbę generowanych przeze mnie słów, jednak metoda ta prawie zawsze zwraca błędy w postaci poniższej:
Traceback (most recent call last):
File "C:\Python27\test.py", line 45, in <module>
synonyms('spray reddish attack force')
File "C:\Python27\test.py", line 39, in synonyms
Word_Set = wordnet.synset(Call)
File "C:\Python27\lib\site-packages\nltk\corpus\reader\wordnet.py", line 1016, in synset
raise WordNetError(message % (lemma, pos))
WordNetError: no lemma 'reddish' with part of speech 'n'
Nie mam dużej kontroli nad danymi, które będą nadpisywane, a więc po prostu czyszczenie mojego korpusu nie jest tak naprawdę opcją. Wszelkie pomysły, jak rozwiązać ten problem?
Zrobiłem więcej badań i mam obiecującą przewagę, ale nadal nie jestem pewien, w jaki sposób mogę go wdrożyć. W przypadku nie znalezionego lub nieprawidłowo przypisanego słowa chciałbym użyć metryki podobieństwa (Leacock Chodorow, Wu-Palmer itp.), Aby powiązać słowo z najbliższym poprawnie sklasyfikowanym innym słowem kluczowym. Być może w połączeniu z miarą odległości edycyjnej, ale znowu nie byłem w stanie znaleźć żadnej dokumentacji na ten temat.
Próbuję teraz uruchomić ten kod na chwilę i wydaje się być pełen błędów. Po pierwsze, "worndet" nie jest częścią NLTK, a organizacja pakietów trochę się poruszyła. – aendrew
Przepraszamy, ten kod ma 11 miesięcy. Tak, nltk zmienił się nieco, opublikował zmienioną i działającą wersję dla nowej wersji nltk w miejsce starej. –
Warto również zauważyć, że wyszukiwanie w słowie wordnet jest dość powolne i teoretycznie powinno zostać przekazane do podprocesu. Jeśli chcesz trochę posprzątać i sprawić, że będzie to lepsze narzędzie, daj mi znać, a ja mogę o tym powiedzieć na Github i skopiować na ten temat. –