【问题标题】:How to trim text to certain length, full sentences?如何将文本修剪成一定长度的完整句子?
【发布时间】:2012-11-10 13:37:44
【问题描述】:

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

这样的文字

"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 问题 - 大多数答案都是

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

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

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

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

【问题讨论】:

    标签: nlp truncate linguistics text-manipulation sentence


    【解决方案1】:

    如果你得到 80% 的精度就足够了,那么你可以应用简单的规则:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 1970-01-01
        • 2015-10-25
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多