【发布时间】:2010-09-09 15:11:38
【问题描述】:
我想将一段文本分成句子,最好的方法是什么?我想找'.','!','?'字符,但我意识到这存在一些问题,例如当人们使用首字母缩略词时,或者用类似的东西结束句子!?。处理这个问题的最佳方法是什么?我认为会有一些正则表达式可以处理这个问题,但如果它更适合这个问题,我愿意接受非正则表达式的解决方案。
【问题讨论】:
我想将一段文本分成句子,最好的方法是什么?我想找'.','!','?'字符,但我意识到这存在一些问题,例如当人们使用首字母缩略词时,或者用类似的东西结束句子!?。处理这个问题的最佳方法是什么?我认为会有一些正则表达式可以处理这个问题,但如果它更适合这个问题,我愿意接受非正则表达式的解决方案。
【问题讨论】:
Regex 不是解决此问题的最佳方法。通过创建解析库,您会得到更好的服务。您可以轻松创建逻辑块以将一件事与另一件事区分开来。您需要提出一组规则,将文本分解成您希望看到的块。
"Are you sure?" he asked.
在使用正则表达式时不会搞砸吗?但是,使用解析器,您实际上可以看到
<start quote><capitalization>are you sure<question><end quote>he asked<period>
用简单的规则可以说“这是一个句子。”
【讨论】:
"Are you sure"? he asked. 这样的语义正确但看起来非常错误的东西。此外,包含标点符号的名词也不好:Which? recommend buying....
不幸的是,由于您所说的原因,对此没有完美的解决方案。如果内容是您可以以某种方式控制或强制在每个句子后使用指定的分隔符,那将是理想的。除此之外,你真正能做的就是寻找(\.|!|?)+,甚至可能在之后添加一个\s,因为大多数人在新句子的前一句和下一句之间用1或2个空格填充。
【讨论】:
我认为最大的问题是缩略词的可能存在!因此,您必须在 JavaDoc 总结句中使用类似 Prof.&nbsp;Knuth 的内容,以便 javadoc 生成器不会认为第一句在 Prof. 之后结束。
这是一个我不知道任何人如何可靠处理的问题。我能想到的唯一近似解决方案是使用缩写字典。
【讨论】: