Tworzę prosty chatbot. Chcę uzyskać informacje z odpowiedzi użytkownika. Przykładowy scenariusz:
Bot : Hi, what is your name?
User: My name is Edwin.
Chciałbym wydobyć imię Edwin ze zdania. Użytkownik może jednak reagować na różne sposoby, np
User: Edwin is my name.
User: I am Edwin.
User: Edwin.
Próbuję polegać na zależnościach między słowami, ale wynik nie działa dobrze.
Masz pomysł, jakiej techniki mógłbym użyć, aby rozwiązać ten problem?
[AKTUALIZACJA]
Testowałem z rozpoznawaniem nazwanych jednostek wraz z częścią taggera mowy i parsera. Dowiedziałem się, że większość modeli jest trenowana w taki sposób, że pierwszy znak bytu nazwy osoby lub właściwego rzeczownika musi być pisany wielkimi literami. Może tak być w przypadku zwykłego dokumentu, ale nie ma to znaczenia dla chatbota. Na przykład
User: my name is edwin.
Większość NER nie rozpoznała tego.
Odpowiedzi:
Możesz użyć kombinacji rozpoznawania nazwanego podmiotu i analizy składniowej - podczas gdy słowo Edwin z pewnością się podpiera, wyobraź sobie sytuację, w której nazywa się Edward Philip Martel . NER wykrywa każde słowo jako osobne byty (a więc 3 różne byty) - w ten sposób i tak będziesz musiał połączyć je razem w oparciu o pewną logikę. Ponadto, w przypadku obecności wielu nazw, trudniej jest jednoznacznie określić (np. John i Ramsey jedli obiad w Winterfell ).
W tym przypadku pomocna byłaby również analiza składni zdania (przy założeniu, że użytkownik końcowy wprowadzi względnie spójne i prawidłowe zdanie - jeśli używane są slang i krótkie formy tekstu, nawet NLP Stanford może pomóc tylko do pewnego stopnia).
Jednym ze sposobów wykorzystania analizy składniowej / analizy składniowej i NER są następujące przykłady:
W każdym z przypadków (jak również w ogólnym przypadku) nazwa jednostki (nazwa własna / rzeczownik) jest powiązana w pobliżu czasownika. Dlatego jeśli najpierw przeanalizujesz zdanie, aby określić czasowniki, a następnie zastosujesz NER do otaczających (+/- 1 lub 2) słów, możesz mieć względnie przyzwoity sposób rozwiązania problemu. To rozwiązanie zależy przede wszystkim od reguł składni, które tworzysz w celu identyfikacji NER, a także od okna wokół czasowników.
źródło
Powinieneś użyć Named Entity Recognition, na przykład z NLTK, http://www.nltk.org/book/ch07.html <- możesz tam znaleźć przykład użycia. To zadziałałoby całkiem dobrze dla opisanego przypadku.
źródło
Można to łatwo zrobić za pomocą CRF . Możesz użyć kodowania BIO, aby oznaczyć zdanie. Następnie przekaż go do CRF. Musisz tylko utworzyć kilka oznaczonych zdań do celów szkoleniowych w następujący sposób,
CRFsuite i CRF ++ to tylko niektóre z dobrych implementacji. CRFsuite ma otoki Pythona o nazwie pycrfsuite , które jest dość łatwe do wdrożenia. Sprawdź ten notatnik ipython lub ten fragment kodu na github, aby uzyskać kompleksową implementację NER.
sprawdź ten projekt botów typu open source na githubie z NER i klasyfikacją zamiarów napisaną w pythonie. Mają łatwy w użyciu interfejs szkoleniowy, w którym możesz przeszkolić swojego bota, aby wyciągał informacje ze zdań.
źródło
Aby wykonać takie zadania z dużą dokładnością, sugeruję zbudowanie modelu LSTM z osadzaniem słów za pomocą word2vec. LSTM mogą pomóc w uzyskaniu informacji z zdania, a także przewidzieć następny znak lub słowo, jeśli zestaw słów jest już obecny w zdaniu.
źródło