【问题标题】:Splitting text to sentences and sentence to words: BreakIterator vs regular expressions将文本拆分为句子,将句子拆分为单词:BreakIterator vs 正则表达式
【发布时间】:2010-12-19 10:12:54
【问题描述】:

我不小心回答了question,原来的问题涉及将句子拆分为单独的单词。

而作者suggested to use BreakIterator 对输入字符串进行标记,有些人喜欢这个想法。

我只是没有那么疯狂:25 行复杂的代码怎么能比一个简单的带有正则表达式的单行代码更好?

请解释一下使用 BreakIterator 的优点以及应该使用它的真实案例。

如果它真的很酷很合适那么我想知道:你真的在你的项目中使用BreakIterator 的方法吗?

【问题讨论】:

  • @Kobi:现在听起来应该更好了。

标签: java regex string comparison tokenize


【解决方案1】:

通过查看该答案中发布的代码,BreakIterator 似乎考虑了文本的语言和区域设置。通过正则表达式获得这种级别的支持肯定会是一个相当大的痛苦。也许这就是它优于简单正则表达式的主要原因?

【讨论】:

  • +1 - 对正则表达式进行正确的、区域敏感的文本处理太复杂了。
【解决方案2】:

BreakIterator 提供了一些很好的显式控制,并以嵌套方式清晰地迭代每个句子和单词。我不熟悉指定区域设置对您的确切作用,但我敢肯定它有时也很有帮助。

我并没有觉得它很复杂。只需为句子级别设置一个迭代器,为单词级别设置另一个迭代器,将单词第一个嵌套在第二个中。

如果问题变成了不同的问题,那么您在另一个问题上的解决方案可能就已经失效了。但是,这种遍历句子和单词的模式可以做很多事情。

  1. 找出任何单词出现次数最多的句子。将其与该单词一起输出
  2. 找出整个字符串中使用次数最多的单词。
  3. 查找每个句子中出现的所有单词
  4. 查找在 2 个或更多句子中出现素数次数的所有单词

名单还在继续……

【讨论】:

  • “我不知道指定语言环境对你有什么作用……” 边界规则因语言而异,因此也因语言环境而异;例如javadoc 说“用户认为是字符”是特定于语言的。
  • 是的,我想了很多,但很难说出具体细节。句号和空格似乎很明显,但我毫不怀疑其中有微妙之处,即使我无法立即想到任何细节。
  • 某些语言(亚洲等)没有空格。其他语言的单词很长,需要特殊的破坏规则。等等。
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 2014-11-02
  • 1970-01-01
相关资源
最近更新 更多