Rails gem将一段打破成一系列句子

时间:2013-06-02 01:45:52

标签: ruby-on-rails ruby rubygems split slice

我正在尝试将一个段落分成一系列句子,使每个句子组保持在N个字符之下。如果单个句子长于N,则应将其拆分为带有标点符号或空格作为分隔符的块。

例如,如果N = 50,则接下来的字符串

  

“Lorem ipsum,consectetur elit.Donec ut ligula.Sed acumsan posuere tristique.Sed et tristique sem.Aenean sollicitudin,sapien sodales elementum blandit.Fusce urna libero blandit eu aliquet ac rutrum vel tortor。”

会变成

  

[“Lorem ipsum,consectetur elit.Donec ut ligula。”,“Sed acumsan posuere tristique。”,“Sed et tristique sem。”,“Aenean sollicitudin”,“sapien sodales elementum blandit。”,“Fusce urna libero blandit eu aliquet ac rutrum vel“,”tortor。“]

是否有任何可以帮助我实现这一目标的导轨宝石?我看了html_slicer,但我不确定它能处理上面的例子。

1 个答案:

答案 0 :(得分:1)

有两个非平凡的任务可以实现您的目标:

  1. 将字符串拆分为句子
  2. 并对每个句子进行包装,并特别注意标点符号。

  3. 我认为第一个从头开始并不容易实现,所以最好的选择可能只是使用自然语言处理库,前提是您的“第三方语言处理服务”没有这样的功能。我不知道任何“rails gem”符合你的要求。

    以下是使用stanford-core-nlp将字符串拆分为句子的玩具示例。

    require 'stanford-core-nlp'
    text = "Lorem ipsum, consectetur elit. Donec ut ligula. Sed acumsan posuere tristique. Sed et tristique sem. Aenean sollicitudin, sapien sodales elementum blandit. Fusce urna libero blandit eu aliquet ac rutrum vel tortor."
    pipeline = StanfordCoreNLP.load(:tokenize, :ssplit)
    a = StanfordCoreNLP::Annotation.new(text)
    pipeline.annotate(a)
    sentenses = a.get(:sentences).to_a.map &:to_s # Map with to_s if you want an array of sentence string.
    # => ["Lorem ipsum, consectetur elit.", "Donec ut ligula.", "Sed acumsan posuere tristique.", "Sed et tristique sem.", "Aenean sollicitudin, sapien sodales elementum blandit.", "Fusce urna libero blandit eu aliquet ac rutrum vel tortor."]
    

    第二个问题类似于自动换行,如果它确实是一个自动换行问题,它应该可以使用ActionView :: Helpers :: TextHelper.word_wrap等现有实现轻松解决。 但是,有关标点符号的额外要求。我不知道任何现有的实现方式可以实现与您完全相同的目标。也许你必须提出自己的解决方案。

    我唯一的想法是首先对每个句子进行自动换行,然后用标点符号分割每一行,然后再次加入各个部分,但长度有限制。我想知道这是否会奏效。