2015-08-06 17 views
12

Ben cümlelere içine sonraki string kırmak istiyorum:OpenNLP ve stringi ile cümle sınırları nasıl belirlenir?

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

Ben iki farklı yol göstermek istiyorum. Bir paketin openNLP geliyor:

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

Ve ikinci paketin stringi geliyor:

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

Ben fazladan boşlukları kaldırmak veya tekrar cümlelere yeni bir dize kırmaya cümleler hazırlamak gerekir bu ikinci yolla sonra. Sonuç kalitesini iyileştirmek için stringi işlevini ayarlayabilir miyim? Büyük bir veri hakkında olduğunda, openNLP, stringi (çok fazla) daha yavaştır, daha sonra stringi.
stringi (-> hızlı) ve openNLP (-> kalite) birleştirmenin bir yolu var mı?

+5

burada bir cevap alamazsanız, şansın olabilir [R forumuna sahip corpus linguistics] (https://groups.google.com/forum/#!forum/corpling-with-r) – drammock

+1

Bunu ** stringi ** 'nin HitHub sayfasındaki bir sorun olarak açtım : https://github.com/Rexamine/stringi/issues/184 –

+0

OpenNLP ve stringi, cümle sınırlarının nasıl tespit edileceği konusunda birbirlerinden farklıdır. stringi bir dizi kural ile çalışır gibi görünüyor. Ve openNLP bir öğrenme sürecinden bir modelle çalışır. Ama hala şişe boynunun nerede olduğunu göremiyorum. – SRRussel

cevap

5

Bu uygulanabilir bir regex çözüm olabilir:

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

gerçekleştirir daha az tarih: (Stringi içinde ve dolayısıyla)

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

Metin sınır (bu durumda, cümle sonu) analizi yoğun bakımda Unicode UAX29'da açıklanan kurallara tabidir, ayrıca bkz ICU Users Guide on the topic. Okunduğumuz: "Unicode kuralları", "... Bay." Gibi durumları tespit edememektedir. Jones..."; Bu tür vakaları tespit etmek için daha sofistike bir terzilik gerekli olacaktır. Başka bir deyişle, bu, aslında openNLP'da uygulanmış olan, kesintisiz sözcüklerin özel bir sözlüğü olmadan gerçekleştirilemez.

  1. Kullanım stri_split_boundaries ve sonra yanlış bölünmüş belirteçleri katıldı gereken karar bir fonksiyon yazabiliriz: Birkaç olası senaryo bu nedenle olur şunlardır Bu görevi gerçekleştirmek için Stringi dahil etmek.
  2. Manuel giriş olmayan kırma muhtemelen noktalar sonra metin (içine boşluk aşağıdaki vb LaTeX belgeleri hazırlarken, Sn, vb yani ve (bu gerçeği gerekli olduğunu unutmayın - aksi takdirde . kelimeler arasında çok büyük boşluklar) almak
  3. bir regex içine özel bir durmaksızın kelime listesini dahil edin ve uygulayın stri_split_regex. vb

ve.

+1

Bu, bir noktada ** stringi ** 'ye dahil olabileceğinizden daha iyi bir çözümden ilham aldı. –

İlgili konular