【问题标题】:How to Split a Paragraph into Sentences如何将段落拆分为句子
【发布时间】:2011-01-10 15:01:57
【问题描述】:

我一直在尝试使用:

$string="The Dr. is here!!! I am glad I'm in the U.S.A. for the Dr. quality is great!!!!!!";
preg_match_all('~.*?[?.!]~s',$string,$sentences);
print_r($sentences);

但它不适用于 Dr., U.S.A. 等。

有人有更好的建议吗?

【问题讨论】:

  • 我不太了解正则表达式,但我在想是否有办法说最后一句之前的句子必须至少有 5 个字符长或类似的东西......
  • 好吧,为了满足这种情况,您需要一个正则表达式来检查空格后跟一个大写字母,然后再进行拆分。我对正则表达式不熟悉,也许你可以这样做,但我认为规则可能很快就会变得更加复杂,可能你会使用一个简单的正则表达式 + 一个小状态机的组合来正确地做到这一点。跨度>
  • 大写字母后面的空格不一定有效。想象一下使用这句话:Hello, Dr. Smith is ready for you. Please go to the E.R. where he is waiting.
  • Aaron:这就是为什么我说你需要将它与状态机结合起来。
  • Scott:这实际上只是一个区域,您可以根据某些变量的当前“状态”来决定行动方案。所以你会在'。你会有一个“博士”的“previousWord”。然后,您可以在“以 . 结尾但不以句子结尾的合法词”(或一些更复杂的模型)的列表中查找它,并决定是否在该点拆分成句子。

标签: php regex split text-segmentation


【解决方案1】:

没有任何简单的解决方案。您需要在应用程序中进行一些自然语言处理 (NLP) 并识别每个句子。有个东西叫OpenNLP,它是一个基于 JAVA 的 NLP 解析器工具。或 Ruby 中的 Stanford NLP parser。你可以为 php 找到类似的东西。

here我在PHP中找到了一组用于自然语言处理的类。

【讨论】:

  • +1 - 事实上,即使是使用 NLP 的解决方案在面对足够非正式(例如草率)的写作时也可能会失败,如果人们不遵循标点符号的基本规则,你就会被塞满.
  • 该项目的文件似乎不再在线
【解决方案2】:

嗯,也许可以试试$sentences = preg_split('/.*?[?.!]+\s+/', $string);

【讨论】:

    【解决方案3】:

    这几乎是不可能的,因为您的示例清楚地表明标点符号可以用于例如Dr., U.S.A 等,使我们无法知道句子的开始/结束位置。

    您必须搜索以下字符以确定新句子是否跟随(开始于)您提到的标点符号。

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 2013-08-13
      • 2014-06-01
      • 2020-09-21
      • 1970-01-01
      相关资源
      最近更新 更多