Wyodrębnij informacje ze zdania

11

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.

edwin
źródło
To wyjaśnia, jak zbudowane są nowoczesne boty czatu, ale nie nazwałbym tego prostym. Możesz dowiedzieć się więcej, wyszukując „odpowiadanie na pytania”.
Emre
Podoba mi się, jak ludzie zadający pytania i otrzymujący odpowiedzi oznaczają odpowiedź jako akceptowalną: P
chewpakabra

Odpowiedzi:

7

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:

 1. User: Edwin is my name.
 2. User: I am Edwin.
 3. User: My name is Edwin.

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.

vsdaking
źródło
2
Być może zaimplementujesz „niedeterministyczne skończone automaty”, w których każde zdanie jest odpowiedzią akceptowaną przez wzorzec. Niektóre gramatyki są implementowane na czymś takim. (NLP / Gramatyka). Jeśli potrzebujesz, jak to zrobić, spójrz na ramy stanfordnlp.github.io/CoreNLP
Intruso
5

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.

chewpakabra
źródło
4

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,

 I am Edwin.
 O O  B-NAME

 You can call me Alfred
 O   O    O    O B-NAME

 My name is  Edwin   thomas
 O  O     O  B-NAME  I-NAME

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ń.

Alfred Francis
źródło
0

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.

enterML
źródło