您如何将一段文本解析为句子? (最好在Ruby中)
nlp
ruby
10
0

考虑到Mr.,Dr。和USA等案例,您如何将段落或大量文本分成句子(最好使用Ruby)? (假设您只是将句子放入数组数组中)

更新:我想到的一种可能的解决方案涉及使用词性标记(POST)和分类器来确定句子的结尾:

从琼斯先生那里获取数据时,当他走出意大利避暑别墅的阳台时,脸上感到温暖的阳光。他很高兴活着。

分类者Mr./PERSON Jones / PERSON感到/ O / O温暖/ O阳光/ O上/ O他/ O脸部/ O //他/ O踩着/ O外出/ O上/ O / O阳台/ O / O他的/ O夏季/ O房屋/ O在/ O意大利/ LOCATION ./O他/ O是/ O快乐/ O到/ O是/ O活着/ O ./O

POST先生/ NNP Jones / NNP感到/ VBD / DT暖/ JJ sun / NN开/ IN他/ PRP $脸部/ NN当/ IN他/ PRP踩踏/ VBD出/ RP上/ IN / DT阳台/ / IN的NN /他的/ PRP $夏季/ NN的住所/ NN / IN的意大利。/NNP他/ PRP是/ VBD高兴/ JJ到/要/ VB还活着。/IN

我们可以假设,由于意大利是一个地点,所以句号是句子的有效结尾?自从以“先生”结尾。不会有其他词性,我们可以假设这不是一个有效的句子期吗?这是对我的问题的最佳答案吗?

有什么想法吗?

参考资料:
Stack Overflow
收藏
评论
共 6 个回答
高赞 时间 活跃

为了清楚起见,没有简单的解决方案。 快速的Google搜索显示,这是NLP研究的主题。

但是,似乎有些开源项目正在处理支持句子检测的NLP,我发现了以下基于Java的工具集:

openNLP

补充说明:在自然语言处理中 ,决定句子在何处开始和结束的问题也称为句子边界消歧 (SBD)。

收藏
评论

不幸的是,我不是一个红宝石专家,但是也许以perl为例可以使您朝着正确的方向前进。在结尾标点后面使用不匹配的后缀,然后在不后缀中使用一些特殊情况,后跟任意数量的空格,然后再前看大写字母。我确定这不是完美的方法,但我希望它能为您指明正确的方向。不知道您怎么知道美国实际上是否在句子的结尾。

#!/usr/bin/perl

$string = "Mr. Thompson is from the U.S.A. and is 75 years old. Dr. Bob is a dentist. This is a string that contains several sentances. For example this is one. Followed by another. Can it deal with a question?  It sure can!";

my @sentances = split(/(?:(?<=\.|\!|\?)(?<!Mr\.|Dr\.)(?<!U\.S\.A\.)\s+(?=[A-Z]))/, $string);

for (@sentances) {
    print $_."\n";
}
收藏
评论

如果您真的在乎正确的话,这将是一个难题。您会发现NLP解析器软件包可能提供此功能。如果您想要更快的速度,则最终需要将某些功能与经过训练的令牌窗口的概率函数进行复制(您可能希望将换行符算作令牌,因为如果这是段落的结尾)。

编辑:如果可以使用Java,我建议使用斯坦福解析器。我没有其他语言的推荐,但是我对听到开源还有什么很感兴趣。

收藏
评论

看看NLTK (自然语言工具包)中的Python句子拆分器:

朋克句子标记器

它基于以下论文:

Kiss,Tibor和Strunk,2006年1月: 无监督的多语言句子边界检测计算语言学 32:485-525。

本文中的方法非常有趣。它们将句子拆分的问题减少到确定单词与后续标点符号关联的问题。缩写后的句段过载是大多数歧义句段的原因,因此,如果您可以识别缩写,则可以以很高的概率识别句子边界。

我已经对该工具进行了非正式的测试,它对于多种(人类)语言似乎都给出了不错的结果。

将其移植到Ruby并非易事,但可能会给您一些想法。

收藏
评论

看起来这颗红宝石可以解决问题。

https://github.com/zencephalon/Tactful_Tokenizer

收藏
评论

尝试查看Stanford Parser周围的Ruby包装器 。它具有getSentencesFromString()函数。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题