Albero delle frasi e lista delle parole

4

Recentemente mi è stato assegnato il compito di creare un identificatore di nomi di entità come parte di un progetto. L'obiettivo era analizzare una determinata frase e trovare tutte le possibili combinazioni delle entità.

Un approccio suggerito consisteva nel mantenere una tabella di ricerca per tutte le parole del connettore note come articoli e congiunzioni, rimuoverle dall'elenco delle parole dopo aver diviso la frase sulla base degli spazi. Questo lascerebbe fuori le Entità Nome nella frase.

Viene quindi eseguita una ricerca per queste entità identificate su un'altra tabella di ricerca che le associa al tipo di entità, ad esempio se la frase era: Remember the Titans was a movie directed by Boaz Yakin , i possibili risultati sarebbero:


{Remember the Titans,Movie} was {a movie,Movie} directed by {Boaz Yakin,director}
{Remember the Titans,Movie} was a movie directed by Boaz Yakin
{Remember the Titans,Movie} was {a movie,Movie} directed by Boaz Yakin
{Remember the Titans,Movie} was a movie directed by {Boaz Yakin,director}
Remember the Titans was {a movie,Movie} directed by Boaz Yakin
Remember the Titans was {a movie,Movie} directed by {Boaz Yakin,director}
Remember the Titans was a movie directed by {Boaz Yakin,director}
Remember the {the titans,Movie,Sports Team} was {a movie,Movie} directed by {Boaz Yakin,director}
Remember the {the titans,Movie,Sports Team} was a movie directed by Boaz Yakin
Remember the {the titans,Movie,Sports Team} was {a movie,Movie} directed by Boaz Yakin
Remember the {the titans,Movie,Sports Team} was a movie directed by {Boaz Yakin,director}

La tabella di ricerca delle entità qui conterrà i seguenti dati:

Remember the Titans=>Movie
a movie=>Movie
Boaz Yakin=>director
the Titans=>Movie
the Titans=>Sports Team

Un'altra logica alternativa che è stata avanzata è stata la costruzione di un albero della frase grezzo che avrebbe contenuto le parole del connettore nella tabella di ricerca come nodi parent e fare una ricerca nella tabella delle entità per il nodo foglia che potrebbe contenere le entità. L'albero che è stato costruito per la frase sopra sarebbe:

La domanda che ho di fronte è i benefici dei due approcci, dovrei andare per l'approccio ad albero per rappresentare l'analisi della frase, poiché fornisce una struttura più semantica? C'è un approccio migliore che dovrei risolvere per risolverlo?

    
posta Rohit Jose 21.12.2013 - 11:04
fonte

1 risposta

6

A meno che tu non abbia una vasta esperienza nell'elaborazione del linguaggio naturale, potrei utilizzare una libreria esistente contro il rotolare il tuo riconoscitore di entità con nome. Anche se sei un esperto di PNL, una libreria molto utilizzata avrà probabilmente molte più ore di test dedicate al tuo nuovo riconoscimento. Inoltre, è probabile che le biblioteche esistenti siano più flessibili poiché vengono utilizzate in diversi progetti. Tieni presente che alcune librerie hanno licenze limitate per progetti commerciali.

Non è chiaro come potrebbe funzionare il tuo primo approccio poiché articoli, congiunzioni e altre parole "connettore" fanno spesso parte delle entità nominate. La divisione (tokenizing) della frase su uno spazio bianco è anche soggetta a errori poiché molte entità con nome contengono più di una parola (New York, Remember the Titans, Per chi suona la campana ...). Infine, se stai utilizzando una tabella di ricerca per determinare quali parole non di connessione sono denominate entità, avrai molti falsi positivi come mostrato in capitolo 7.5 di Natural Language Processing con Python .

Penso che il tuo secondo approccio sia un passo nella giusta direzione, sebbene soffra anche delle limitazioni sopra menzionate. Hai bisogno di un albero, ma hai bisogno di un albero che rappresenti tutte le parti del discorso . Ad esempio, il valore NLTK predefinito denominato chunker di entità fornisce un albero ricco:

sentence = "Remember the Titans was a movie by Boaz Yakin."
tokens = nltk.word_tokenize(sentence)
pos_tags = nltk.pos_tag(tokens)
print(nltk.ne_chunk(pos_tags))

# output:

(S
  Remember/NNP
  the/DT
  Titans/NNPS
  was/VBD
  a/DT
  movie/NN
  by/IN
  (PERSON Boaz/NNP Yakin/NNP)
  ./.)

Naturalmente, il chunker di entità di default chiamato NLTK mancava di "Remember the Titans" come una singola entità con nome (sebbene riconoscesse "Boaz Yakin"). Questo fa apparire la parte più difficile del riconoscimento di entità con nome. Anche con una libreria ricca e collaudata, dovrai addestrare il tuo identificatore di entità con i dati che meglio si adattano ai tuoi dati. (Il chunker di entità con nome predefinito di NLTK è addestrato sul corpus ACE .) Se sei interessato, Matt Johnson dà un'occhiata più da vicino al default NLTK denominato entità chunker in Sollevando il cofano sul chunker NE di NLTK .

    
risposta data 28.12.2013 - 03:06
fonte