2015-08-06 15 views
12

Voglio rompere prossimo string in frasi:Come rilevare i limiti di frase con OpenNLP e stringi?

library(NLP) # NLP_0.1-7 
string <- as.String("Mr. Brown comes. He says hello. i give him coffee.") 

Voglio dimostrare due modi diversi. Uno viene dal pacchetto openNLP:

library(openNLP) # openNLP_0.2-5 

sentence_token_annotator <- Maxent_Sent_Token_Annotator(language = "en") 
boundaries_sentences<-annotate(string, sentence_token_annotator) 
string[boundaries_sentences] 

[1] "Mr. Brown comes." "He says hello."  "i give him coffee." 

E in secondo luogo viene dal pacchetto stringi:

library(stringi) # stringi_0.5-5 

stri_split_boundaries(string , opts_brkiter=stri_opts_brkiter('sentence')) 

[[1]] 
[1] "Mr. "        "Brown comes. "      
[3] "He says hello. i give him coffee." 

Dopo questo secondo modo in cui ho bisogno di preparare frasi per rimuovere gli spazi aggiuntivi o rompere una nuova stringa in frasi di nuovo. Posso regolare la funzione stringa per migliorare la qualità dei risultati?

Quando si tratta di dati di grandi dimensioni, openNLP è (molto) più lento di stringi.
C'è un modo per combinare stringi (-> veloce) e openNLP (-> qualità)?

+5

se non si ottiene una risposta qui, potresti avere fortuna [linguistica del corpus con il forum R] (https://groups.google.com/forum/#!forum/corpling-with-r) – drammock

+1

L'ho aperto come un problema anche nella pagina HitHub di ** stringi ** : https://github.com/Rexamine/stringi/issues/184 –

+0

OpenNLP e stringi differiscono tra loro su come rilevare i limiti di frase. stringi sembra funzionare con un insieme di regole. E openNLP funziona con un modello da un processo di apprendimento. Ma continuo a non vedere dove si trova il collo della bottiglia ... – SRRussel

risposta

5

Questa può essere una soluzione valida espressione regolare:

string <- "Mr. Brown comes. He says hello. i give him coffee." 
stringi::stri_split_regex(string, "(?<!\\w\\.\\w.)(?<![A-Z][a-z]\\.)(?<=\\.|\\?|\\!)\\s") 

## [[1]] 
## [1] "Mr. Brown comes." "He says hello."  "i give him coffee." 

Esegue meno pure sulle:

string <- "Mr. Brown comes! He says hello. i give him coffee. i will got at 5 p. m. eastern time. Or somewhere in between" 
9

confine testo (in questo caso, la sentenza di confine) Analisi in ICU (e quindi in stringi) è regolato dalle regole descritte in Unicode UAX29, vedere anche ICU Users Guide on the topic. Leggiamo:

[Le regole Unicode] non possono rilevare casi come "... Mr. Jones ...”; Sarebbe necessario un sartoria più sofisticata per rilevare tali casi.

In altre parole, questo non può essere fatto senza un dizionario personalizzato di parole non-stop, che di fatto è implementato in openNLP. Alcuni possibili scenari di incorporare stringi per l'esecuzione di questa operazione sarebbe quindi comprendere:

  1. Usa stri_split_boundaries e quindi scrivere una funzione di decidere su quale gettoni in modo errato dividere devono essere uniti.
  2. inserire manualmente spazi unificatori nel testo (possibilmente dopo puntini seguente ecc, signor, cioè e così via (si noti che è necessario installare questo in effetti durante la preparazione dei documenti in LaTeX - altrimenti si ottenere troppo grandi spazi tra le parole).
  3. incorporare un elenco di parole non-stop su misura in una regex e applicare il stri_split_regex.

e così via.

+1

Questo ha ispirato una soluzione migliore sotto che potresti essere in grado di incorporare in ** stringi ** ad un certo punto. –

Problemi correlati