我正在寻找一种将未知文本修剪到一定长度的解决方案。只保留完整的句子。
所以像这样的文字
"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问题。感谢。
答案 0 :(得分:1)
如果足以让你获得80%的精确度,那么你可以应用简单的规则:
如果你需要更好的东西,那么我担心你需要nlp库。如果你有php / ruby托管,那么你应该可以使用NLTK。它是用python编写的,并且有很大的支持。
答案 1 :(得分:0)
我解决这个问题的粗略想法是检查最后一个句子分隔符(即点空格),检查是否有点空间分隔的数字或该位置周围的已知模式,如果有,怯懦地选择前一句。也许计算下一个非数字点空间位置,如果它处于某个软限制(比如$ limit + 10),则选择当前句子。