Chatbot z Pytonem : Rozpoznawanie nazwanych jednostek

https://szkolazpieklarodem.pl/

Rozpoznawanie nazwanych jednostek (NER), znane również pod innymi nazwami, takimi jak identyfikacja jednostek lub wyodrębnianie jednostek, to proces wyszukiwania i klasyfikowania nazwanych jednostek istniejących w danym tekście do wcześniej zdefiniowanych kategorii. Zadanie NER jest w ogromnym stopniu zależne od bazy wiedzy używanej do uczenia algorytmu ekstrakcji NE, więc może działać, ale nie musi, w zależności od dostarczonego zbioru danych, na którym zostało przeszkolone. spaCy posiada bardzo szybki model rozpoznawania jednostek, który jest w stanie zidentyfikować frazy jednostek z danego dokumentu. Jednostki mogą być różnych typów, np. osoba, lokalizacja, organizacja, daty, cyfry itp. Dostęp do tych encji można uzyskać poprzez właściwość .ents obiektu doc. Spróbujmy znaleźć nazwane jednostki, biorąc kilka przykładów z pomocą potężnej możliwości tagowania NER spaCy.

Przykład 1:

my_string = u”Google has its headquarters in Mountain View, California

having revenue amounted to 109.65 billion US dollars”

doc = nlp(my_string)

for ent in doc.ents:

print(ent.text, ent.label_)

Output:

(‘Google’, ‘ORG’)

(‘Mountain View’, ‘GPE’)

(‘California’, ‘GPE’)

(‘109.65 billion US dollars’, ‘MONEY’)

Widzimy jak pięknie i automagicznie model spaCy z łatwością potrafił zidentyfikować, że słowo Google jako Organizacja, Kalifornia to byt geopolityczny, a w podanym zdaniu mówimy o 109,65 miliardach dolarów amerykańskich, co tak naprawdę chodzi o pieniądze. Spróbujmy zbadać więcej przykładów.

Przykład 2:

my_string = u”Mark Zuckerberg born May 14, 1984 in New York is an American technology entrepreneur and philanthropist best known for co-founding and leading Facebook as its chairman and CEO.”

doc = nlp(my_string)

for ent in doc.ents:

print(ent.text, ent.label_)

Wyjście:

(‘Mark Zuckerberg’, ‘PERSON’)

(‘May 14, 1984’, ‘DATE’)

(‘New York’, ‘GPE’)

(‘American’, ‘NORP’)

(‘Facebook’, ‘ORG’)

Przykład 3:

my_string = u”I usually wake up at 9:00 AM. 90% of my daytime goes in

learning new things.”

doc = nlp(my_string)

for ent in doc.ents:

print(ent.text, ent.label_)

Wyjście:

(‘9:00 AM’, ‘TIME’)

(‘90%’, ‘PERCENT’)

Jak widać, ekstraktor encji może z łatwością wyodrębnić informacje o czasie z danego ciągu. Jak widać ekstraktor jednostek próbuje nie tylko zidentyfikować liczbę, ale także dokładną wartość PROCENTOWĄ. Zgodnie z dokumentacją spaCy, modele trenowane w korpusie OntoNotes 51 obsługują następujące typy jednostek.

TYP: OPIS

PERSON: Ludzie, także fikcyjni

NORP: Narodowości, grupy religijne lub polityczne

FAC: Budynki, lotniska, autostrady, mosty itp.

ORG: Firmy, agencje, instytucje itp.

GPE: Kraje, miasta, stany

LOC: lokalizacje inne niż GPE, pasma górskie, zbiorniki wodne

PRODUCT: Przedmioty, pojazdy, żywność itp. (nie usługi)

EVENT : Nazwane huragany, bitwy, wojny, wydarzenia sportowe itp.

WORK_OF_ART: Tytuły książek, piosenek itp.

LAW : Nazwane dokumenty przekształcone w prawa

LANGUAGE: Dowolny nazwany język

DATE: Bezwzględne lub względne daty lub okresy

TIME: Czasy krótsze niż jeden dzień

PERCENT: Procent, w tym „%”

MONEY: Wartość pieniężna, łącznie z jednostką

QUANTITY: Wymiary, takie jak waga lub odległość

ORDINAL: „pierwszy”, „drugi” itp.

CARDINAL: Liczby, które nie należą do innego typu

Ilekroć mamy zamiar zbudować agenta konwersacyjnego lub chatbota w prostych słowach, zawsze mamy na myśli domenę. Na przykład chcemy, aby chatbot umawiał wizytę u lekarza, zamawiał jedzenie, płacił rachunki, wypełniał wnioski bankowe, zajmował się handlem elektronicznym itp. Chatbot mógłby również rozwiązywać kombinację tych problemów. Znając podmiot występujący w pytaniu, można uzyskać rzetelny obraz kontekstu, w jakim pytanie zostało zadane. Spróbujmy to zrozumieć na przykładzie dwóch zdań z podobnymi słowami i różnymi znaczeniami.

my_string1 = u”Imagine Dragons are the best band.”

my_string2 = u”Imagine dragons come and take over the city.”

doc1 = nlp(my_string1)

doc2 = nlp(my_string2)

for ent in doc1.ents:

print(ent.text, ent.label_)

The above for loop over doc1 object gives an output:

(‘Imagine Dragons’, ‘ORG’)

Niesamowite, prawda? Stanie się bardziej intrygujące, gdy zdasz sobie sprawę, że moduł rozpoznawania jednostek nie rozpoznaje żadnej jednostki w drugim ciągu. Uruchom następujący kod, a dokument doc2 nie wygeneruje żadnych danych wyjściowych.

for ent w doc2.ents:

print(ent.text, ent.label_)

Teraz wyobraź sobie, że chcesz wyodrębnić kontekst powyższych dwóch ciągów w środowisku na żywo. Co byś zrobił? Za pomocą Entity Extractor można łatwo rozgryźć kontekst wypowiedzi i inteligentnie poprowadzić rozmowę dalej.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *