如何使用OpenNLP和stringi检测句子边界?

时间:2015-08-06 20:47:06

标签: regex r text-mining opennlp stringi

我想将下一个string分成句子:

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

我想展示两种不同的方式。一个来自包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."  

第二个来自包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."

在第二种方式之后,我需要准备句子来删除额外的空格或者再次将新的字符串分解成句子。我可以调整stringi函数来提高结果的质量吗?

当涉及大数据时,openNLPstringi慢得多。{非常多}。 有没有办法合并stringi( - &gt;快速)和openNLP( - &gt;质量)?

2 个答案:

答案 0 :(得分:9)

ICU中的文本边界(在本例中为句子边界)分析(因此在stringi中)由Unicode UAX29中描述的规则控制,另请参阅ICU Users Guide on the topic。我们读到:

  

[Unicode规则]无法检测到诸如“......先生。琼斯......”;检测此类案件需要更复杂的剪裁。

换句话说,如果没有不间断词的自定义词典,就无法做到这一点,实际上这是在openNLP中实现的。因此,包含stringi以执行此任务的一些可能方案包括:

  1. 使用stri_split_boundaries,然后编写一个函数,决定应该将哪些错误分割的标记连接起来。
  2. 在文本中手动输入不间断的空格(可能在之后的点先生等之后(注意)事实上,这在LaTeX中准备文档时是必需的 - 否则你在单词之间会有太大的空间。
  3. 将自定义不间断单词列表合并到正则表达式中并应用stri_split_regex
  4. 等等。

答案 1 :(得分:5)

这可能是一个可行的正则表达式解决方案:

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

执行得不太好:

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