2015-08-14 13 views
17

Właśnie zacząłem z OpenNLP. Muszę stworzyć prosty model szkoleniowy do rozpoznawania nazw.Jak stworzyć dobry model treningowy NER w OpenNLP?

przeczytaniu doc ​​tutaj http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.namefind widzę ten prosty tekst trenować model:

<START:person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 . 
Mr . <START:person> Vinken <END> is chairman of Elsevier N.V. , the Dutch publishing group . 
<START:person> Rudolph Agnew <END> , 55 years old and former chairman of Consolidated Gold Fields PLC , 
    was named a director of this British industrial conglomerate . 

Pytania są dwa:

  • Dlaczego muszę umieścić nazwiska osób w kontekst tekstowy (frazowy)? Dlaczego nie napisać imienia osoby po jednej dla każdej linii? na przykład:

    <START:person> Robert <END> 
    
    <START:person> Maria <END> 
    
    <START:person> John <END> 
    
  • Jak mogę również dodać dodatkowe informacje do tej nazwy? Na przykład chciałbym zapisać informacje Męski/żeński dla każdego imienia.

(wiem, że istnieją systemy, które starają się go zrozumieć czytając ostatnią literę, jak „a” dla Kobieta itp ale chciałbym je dodać sobie)

Dzięki.

Odpowiedz

17

Odpowiedź na pierwsze pytanie jest taka, że ​​algorytm działa na otaczający kontekst (tokeny) w zdaniu; to nie tylko prosty mechanizm wyszukiwania. OpenNLP wykorzystuje maksymalną entropię, która jest formą wielomianowej regresji logistycznej do zbudowania jej modelu. Powodem tego jest zmniejszenie "niejednoznaczności słowa" i znalezienie podmiotów w kontekście. Na przykład, jeśli mam na imię April, łatwo mogę pomylić się z kwietniem, a jeśli mam na imię May, to pomylę się z miesiącem majowym i czasownikiem. W drugiej części pierwszego pytania możesz utworzyć listę znanych imion i użyć ich w programie, który przegląda twoje zdania i automatycznie je adnotuje, aby pomóc Ci utworzyć zestaw treningowy, jednak tworząc listę nazwisk sam bez kontekstu nie wytrenuje modelu w stopniu wystarczającym lub wcale. W rzeczywistości istnieje dodatek OpenNLP o nazwie "dodatek do modelu", który jest przeznaczony do tego celu: nadajesz mu plik nazw i używa on nazw i niektórych danych (zdań) do szkolenia modelu. Jeśli szukasz konkretnych nazw jednostek, które nie są wieloznaczne, lepiej być może, używając listy i czegoś w stylu regex, aby odkryć nazwy zamiast NER.

Jeśli chodzi o twoje drugie pytanie, jest kilka opcji, ale ogólnie rzecz biorąc, nie sądzę, że NER to świetne narzędzie do określania czegoś takiego jak płeć, jednak przy wystarczająco długich szkoleniowych zdaniach możesz uzyskać przyzwoite wyniki. Ponieważ NER używa modelu opartego na otaczających tokenach w zestawie szkoleniowym do zdania, aby ustalić istnienie nazwanego podmiotu, nie może zrobić wiele pod względem identyfikacji płci. Być może lepiej znaleźć wszystkie nazwiska osób, a następnie odwołać się do indeksu nazwisk, o których wiesz, że są męskie lub żeńskie, aby uzyskać dopasowanie. Ponadto, niektóre nazwiska, takie jak Pat, są zarówno męskie, jak i żeńskie, aw większości danych tekstowych nie będzie żadnego wskazania, który z nich nie jest ani człowiekiem, ani maszyną. Mając to na uwadze, można stworzyć osobno model męski i żeński lub stworzyć różne typy jednostek w ramach tego samego modelu. Możesz użyć adnotacji w ten sposób (używając różnych nazw typów jednostek: female.person i female.person). Nigdy tego nie próbowałem, ale może się to udać, musiałbyś przetestować to na swoich danych.

<START:male.person> Pierre Vinken <END> , 61 years old , will join the board as a nonexecutive director Nov. 29 . 
Mrs . <START:female.person> Maria <END> is chairman of Elsevier N.V. , the Dutch publishing group 

NER = Nazwany Entity rozpoznawania

HTH

+1

Dzięki! Tak, powinienem wykonać twój przykład robiąc ** female.person ** and ** male.osoba **, problem polega na tym, że mam wiele imion i nazwisk (około 200 tys.), więc w takim razie czy powinienem pisać za każdym razem te same zdania o innej nazwie ?, np. Pierre Vinken , 61 lat .. ** następnie ** John Travolta , 61 lat ... etc etc? – Dail

+2

ciekawy pomysł ... Chciałbym spróbować i zobaczyć, co się stanie – markg

+0

czy musimy podążać tą drogą? – Dail