如何将文本修剪为一定长度,完整的句子?

时间:2012-11-10 13:37:44

标签: nlp truncate linguistics text-manipulation sentence

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

所以像这样的文字

"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)。

我读过许多问题 - 大多数答案都是

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果你需要更好的东西,那么我担心你需要nlp库。如果你有php / ruby​​托管,那么你应该可以使用NLTK。它是用python编写的,并且有很大的支持。

答案 1 :(得分:0)

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