如何使用 OpenNLP 和 stringi 检测句子边界?
Posted
技术标签:
【中文标题】如何使用 OpenNLP 和 stringi 检测句子边界?【英文标题】:How to detect sentence boundaries with OpenNLP and stringi? 【发布时间】:2015-10-30 04:15:14 【问题描述】:我想将下一个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函数来提高结果的质量吗?
当涉及大数据时,openNLP
(非常)比stringi
慢。
有没有办法结合stringi
(->快速)和openNLP
(->质量)?
【问题讨论】:
如果您在这里没有得到答案,您可能会在corpus linguistics with R forum 上获得好运 我也在 stringi 的 HitHub 页面上打开了这个问题:github.com/Rexamine/stringi/issues/184 OpenNLP 和 stringi 在如何检测句子边界方面彼此不同。 stringi 似乎有一套规则。 openNLP 使用来自学习过程的模型。但我仍然看不到瓶颈在哪里...... 【参考方案1】:ICU(以及 stringi)中的文本边界(在本例中为句子边界)分析受 Unicode UAX29 中描述的规则控制,另请参见 ICU Users Guide on the topic。我们读到:
[Unicode 规则] 无法检测诸如“...Mr.琼斯……”;需要更复杂的剪裁来检测此类情况。
换句话说,如果没有非停用词的自定义词典,这实际上是在openNLP
中实现的。因此,结合 stringi 来执行此任务的一些可能场景包括:
-
使用
stri_split_boundaries
,然后编写一个函数来决定应该加入哪些错误拆分的令牌。
在文本中手动输入不间断空格(可能在 etc.、Mr.、ie 等后面的点之后(注意这实际上是在 LaTeX 中准备文档时所必需的——否则你会在单词之间得到太大的空格。
将自定义非停用词列表合并到正则表达式中并应用stri_split_regex
。
等等。
【讨论】:
这启发了下面一个更好的解决方案,您可以在某些时候将其合并到 stringi 中。【参考方案2】:这可能是一个可行的正则表达式解决方案:
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"
【讨论】:
以上是关于如何使用 OpenNLP 和 stringi 检测句子边界?的主要内容,如果未能解决你的问题,请参考以下文章