Wypróbowałem PorterStemmer i Snowball, ale oba nie działają na wszystkich słowach, brakuje niektórych bardzo popularnych.
Moje słowa testowe to: „ koty biegają w społecznościach kaktusów kaktusów i kaktusów ” i obie mają mniej niż połowę racji.
Zobacz też:
nlp
stemming
lemmatization
manixrock
źródło
źródło
Odpowiedzi:
Jeśli znasz Pythona, zestaw narzędzi języka naturalnego (NLTK) ma bardzo potężny lematyzator, który korzysta z WordNet .
Zwróć uwagę, że jeśli używasz tego lemmatyzatora po raz pierwszy, musisz pobrać korpus przed jego użyciem. Można to zrobić poprzez:
Musisz to zrobić tylko raz. Zakładając, że pobrałeś teraz korpus, działa to tak:
W module nltk.stem są inne lematyzatory , ale sam ich nie wypróbowałem.
źródło
dies
, dajedy
zamiastdie
. Czy nie ma jakiegoś zakodowanego na stałe słownika stemmera?WordNetLemmatizer
błędnie lematyzują?Używam Stanford nlp do wykonywania lematyzacji. W ciągu ostatnich kilku dni miałem podobny problem. Wszystko dzięki stackoverflow, które pomogło mi rozwiązać problem.
Dobrym pomysłem może być również użycie pomijanych słów, aby zminimalizować lematy wyjściowe, jeśli są używane później w klasyfikatorze. Proszę spojrzeć na rozszerzenie coreNlp napisane przez Johna Conwella.
źródło
Wypróbowałem twoją listę terminów w tej witrynie demonstracyjnej o śnieżkach i wyniki wyglądają w porządku ...
Stymulator ma sprowadzić odmienione formy słów do jakiegoś wspólnego rdzenia. Tak naprawdę nie jest zadaniem stempla, aby uczynić z tego korzenia „właściwe” słowo słownikowe. W tym celu należy spojrzeć na analizatory morfologiczne / ortograficzne .
Myślę, że to pytanie dotyczy mniej więcej tego samego, a odpowiedź Kaarela na to pytanie brzmi, skąd wziąłem drugie łącze.
źródło
Trwają debaty stemmer vs lemmatizer. To kwestia preferowania precyzji nad wydajnością. Powinieneś lematyzować, aby uzyskać jednostki znaczące językowo i wywodzić się z użycia minimalnego soku obliczeniowego i nadal indeksować słowo i jego odmiany pod tym samym kluczem.
Zobacz Stemmers vs Lemmatizers
Oto przykład z pythonem NLTK:
źródło
WordNetLemmatizer
jestlemmatize()
może tag POS. A więc z twojego przykładu:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
daje'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? BTW: Dawno się nie widzieliśmy, miejmy nadzieję, że wkrótce spotkamy się na konferencji =)pos=VERB
będziesz lematyzować tylko czasowniki. Rzeczowniki pozostają takie same. Musiałem tylko napisać własny kod, aby obrócić się wokół rzeczywistych znaczników punktu sprzedaży Penn Treebank, aby zastosować poprawną lematyzację do każdego tokena. PonadtoWordNetLemmatizer
śmierdzi lematyzowaniem domyślnego tokenizera nltk. Tak więc przykłady takie jakdoes n't
nie lematyzujądo not
.port.stem("this")
produkujethi
iport.stem("was")
wa
, nawet jeśli dla każdego zapewniona jest właściwa pozycja.Oficjalna strona Martina Portera zawiera Porter Stemmer w PHP, a także w innych językach .
Jeśli naprawdę poważnie myślisz o dobrym pochodzeniu, ale będziesz musiał zacząć od czegoś takiego jak Algorytm Portera, udoskonal go, dodając reguły, aby naprawić nieprawidłowe przypadki typowe dla zbioru danych, a na koniec dodaj wiele wyjątków od reguł . Można to łatwo zaimplementować za pomocą par klucz / wartość (dbm / hash / dictionaries), w których klucz jest słowem do wyszukania, a wartością jest słowo macierzyste, które ma zastąpić oryginał. Komercyjna wyszukiwarka, nad którą kiedyś pracowałem, zakończyła się 800 wyjątkami od zmodyfikowanego algorytmu Portera.
źródło
http://wordnet.princeton.edu/man/morph.3WN
W przypadku wielu moich projektów wolę lematyzator WordNet oparty na leksykonach od bardziej agresywnego pochodzenia portera.
http://wordnet.princeton.edu/links#PHP zawiera łącze do interfejsu PHP do interfejsów API WN.
źródło
Opierając się na różnych odpowiedziach na Stack Overflow i blogach, z którymi się spotkałem, używam tej metody i wydaje się, że całkiem dobrze zwraca prawdziwe słowa. Chodzi o to, aby podzielić przychodzący tekst na tablicę słów (użyj dowolnej metody), a następnie znaleźć części mowy (POS) dla tych słów i użyć ich, aby pomóc wyprowadzić i lematyzować słowa.
Twoja próbka powyżej nie działa zbyt dobrze, ponieważ nie można określić POS. Jeśli jednak użyjemy prawdziwego zdania, wszystko działa znacznie lepiej.
źródło
Zajrzyj do WordNet, dużej leksykalnej bazy danych dla języka angielskiego:
http://wordnet.princeton.edu/
Istnieją interfejsy API umożliwiające dostęp do niego w kilku językach.
źródło
Wygląda to interesująco: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
źródło
Przyjrzyj się LemmaGen - bibliotece open source napisanej w C # 3.0.
Wyniki dla słów testowych ( http://lemmatise.ijs.si/Services )
źródło
Pakiety top python (w żadnym określonym porządku) dla lemmatization to:
spacy
,nltk
,gensim
,pattern
,CoreNLP
iTextBlob
. Preferuję implementację spaCy i gensim (opartą na wzorcu), ponieważ identyfikują one tag POS słowa i automatycznie przypisują odpowiedni lemat. Daje bardziej trafne lematy, zachowując znaczenie nietknięte.Jeśli planujesz używać nltk lub TextBlob, musisz zadbać o ręczne znalezienie odpowiedniego tagu POS i znalezienie odpowiedniego lematu.
Przykład lematyzacji za pomocą spaCy:
Przykład lematyzacji z Gensim:
Powyższe przykłady zostały zapożyczone z tej strony lematyzacyjnej .
źródło
Poszukaj Lucene, nie jestem pewien, czy istnieje port PHP, ale wiem, że Lucene jest dostępny na wiele platform. Lucene to biblioteka do indeksowania i wyszukiwania OSS (z Apache). Oczywiście to i dodatki społeczności mogą mieć coś interesującego do obejrzenia. Możesz przynajmniej nauczyć się, jak to się robi w jednym języku, aby przetłumaczyć „pomysł” na PHP
źródło
Jeśli mogę zacytować moją odpowiedź na pytanie, o którym wspomniał StompChicken:
Ponieważ nie rozumieją języka i nie korzystają ze słownika terminów, nie mają możliwości rozpoznania i odpowiedniego zareagowania na nieregularne przypadki, takie jak „run” / „run”.
Jeśli chcesz poradzić sobie z nieregularnymi przypadkami, musisz albo wybrać inne podejście, albo rozszerzyć swoje wyprowadzanie za pomocą własnego niestandardowego słownika poprawek, aby uruchomić po tym, jak stemmer zrobi swoje.
źródło
Najbardziej aktualną wersją stemmera w NLTK jest Snowball.
Przykłady, jak go używać, znajdziesz tutaj:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
źródło
Możesz użyć łodygi Morpha. UW przesłał program sterujący morfą do Maven Central, jeśli planujesz używać go z aplikacji Java. Jest opakowanie, które znacznie ułatwia korzystanie. Wystarczy dodać ją jako zależność i użyć
edu.washington.cs.knowitall.morpha.MorphaStemmer
klasy. Instancje są wątkowo bezpieczne (oryginalny JFlex miał niepotrzebnie pola klas dla zmiennych lokalnych). Utwórz instancję klasy i uruchommorpha
oraz słowo, które chcesz macierzyste.źródło
.Net Lucene ma wbudowaną łodygę portera. Możesz tego spróbować. Należy jednak pamiętać, że wyprowadzanie portera nie bierze pod uwagę kontekstu słów podczas wyprowadzania lematu. (Przejdź przez algorytm i jego implementację, a zobaczysz, jak to działa)
źródło
Martin Porter napisał Snowball (język do algorytmów rymowania) i przepisał „English Stemmer” w Snowball. Istnieje angielski Stemmer dla C i Java.
Wyraźnie stwierdza, że Porter Stemmer został ponownie zaimplementowany tylko z powodów historycznych, więc testowanie wynikającej poprawności w porównaniu z Porter Stemmer da wyniki, które (powinieneś) już znać.
Dr Porter sugeruje użycie stempli angielskich lub Porter2 zamiast młotka Porter. Angielski stemmer jest tym, co faktycznie jest używane w witrynie demonstracyjnej, na co @StompChicken odpowiedział wcześniej.
źródło
W Javie używam tartargus-snowball do słów kluczowych
Maven:
Przykładowy kod:
źródło
Spróbuj tego tutaj: http://www.twinword.com/lemmatizer.php
Wprowadziłem twoje zapytanie w demo
"cats running ran cactus cactuses cacti community communities"
i otrzymałem["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
z opcjonalną flagąALL_TOKENS
.Przykładowy kod
To jest API, więc możesz się z nim łączyć z dowolnego środowiska. Oto, jak może wyglądać wywołanie PHP REST.
źródło
Gorąco polecam używanie Spacy (bazowe parsowanie i tagowanie tekstu) i Textacy (przetwarzanie tekstu wyższego poziomu oparte na Spacy).
Lemmatyzowane słowa są domyślnie dostępne w Spacy jako
.lemma_
atrybut tokena, a tekst może być lematyzowany podczas wykonywania wielu innych operacji wstępnego przetwarzania tekstu z tekstem. Na przykład podczas tworzenia zbioru terminów lub słów lub ogólnie tuż przed wykonaniem przetwarzania, które tego wymaga.Zachęcam do zapoznania się z obydwoma przed napisaniem kodu, ponieważ może to zaoszczędzić sporo czasu!
źródło
źródło