0

我正在寻找一种将未知文本修剪到一定长度的解决方案。只保留完整的句子。

所以像这样的文字

"Were you born 1. 3. 1987 in Prague? Štěpán Jr. lives there for 3 years now! "

应该变成

"Were you born 1. 3. 1987 in Prague? "

字符限制为 50、40(和 20 与 --find-next-sentence-ending)。

我读过很多 SO question - 大多数答案都是

substr($text, 0, strrpos('.', $text) + 1);

但这显然不适用于上述句子和其他类似句子。其他人建议使用斯坦福文本解析器或 OpenNLP。它们真的很酷,但不适用于典型应用。您不会在 Ruby/PHP 服务器上安装 Java,只是为了修剪文本,对吧。所以我正在寻找一些 80/20 的解决方案,它与语言无关,并且能够处理出现的典型案例。

我想不出比这更有问题的句子(在下一个句子的开头包含日期、非点句结尾和非 ascii 字符,以及“限制”句中间的非结尾点)。

我还创建了一个 GIST (https://gist.github.com/4051035) 供您分叉和玩 - 分叉确保用户可以点击此问题的不同解决方案,所以请使用它;) 我想提出这个问题comunity-wiki,但它似乎不适用于问题 - 仅用于答案。因此,请在评论中添加任何建议/相关的 SO 问题。谢谢。

4

2 回答 2

1

如果它足以让您获得 80% 的精度,那么您可以应用简单的规则:

  • 每个 '?' 和 '!' 标记句尾
  • 当您找到点时,检查下一个单词是否以大写字母开头但不是全部大写(记住它仅适用于 80/20 规则)

如果您需要更好的东西,那么恐怕您需要 nlp 库。如果您有 php/ruby 托管,那么您应该能够使用NLTK。它是用 python 编写的并且有很大的支持。

于 2012-11-17T14:23:55.720 回答
0

我解决这个问题的粗略想法是检查最后一个句子分隔符(即点空间),检查该位置周围是否有点空间分隔的数字或已知模式,如果有,怯懦地选择前一个句子。也许计算下一个非数字点空间位置,如果它处于某个软限制(比如 $limit+10),则选择当前句子。

于 2012-11-10T13:39:32.770 回答