我正在寻找一种解决方案,以将未知文本缩小到某些长度。只保留完整的句子。
所以像这样的文字
"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个带有 - 键 - 句子终止)。
我读了很多问题 - 大多数答案是
的变体substr($text, 0, strrpos('.', $text) + 1);
,但显然,上述句子和其他此类句子都失败了。其他人建议使用斯坦福文本解析器或OpenNLP。它们真的很酷,但不能用于典型应用。您不会在Ruby/PHP服务器上安装Java,只是为了修剪文本。因此,我正在寻找一些80/20的解决方案,这些解决方案将是语言 - 刺耳的解决方案,并且能够处理出现的典型情况。
我想到的句子比这更多的句子(包含一个日期,非点句子结束和非ascii charten在下一个句子的开始和"限制"句子中间的非终止点处)。
我还创建了一个要点(https://gist.github.com/4051035)供您分叉和玩耍 - 分叉确保用户可以单击此问题的不同解决方案,因此请使用;)我想提出这个问题,但看来它不适用于问题 - 只是为了答案。因此,请在评论中添加任何建议/相关的问题。谢谢。
如果足以使您获得80%的精度,则可以应用简单的规则:
- 每个?和 '!'句子的标记末端
- 当您找到点时检查下一个单词是否从上案字母开始,但并非全部在上案例中(请记住,仅适用于80/20规则)
如果您需要更好的东西,恐怕您需要NLP库。如果您有PHP/Ruby托管,则应该能够使用NLTK。它是用python编写的,并得到了极大的支持。
我解决此问题的粗略想法是检查上一个句子分离器(即点空间),检查该位置周围是否有点空间分离的数字或已知模式以及是否存在有,胆怯地选择上一句话。也许计算下一个非数字空间位置,如果它在一定的软限制(例如$ limit 10)中,请选择当前句子。