java中的字符串标记化(LARGE文本)

时间:2012-04-07 08:10:13

标签: java string tokenize stringtokenizer large-data

我有这个大文本(读大写)。我需要对每个单词进行标记,在每个非字母上分隔。我使用StringTokenizer一次读取一个单词。但是,正如我正在研究如何编写分隔符字符串(“每个非字母”)而不是像以下那样:

new StringTokenizer(text, "\" ();,.'[]{}!?:”“…\n\r0123456789 [etc etc]");

我发现每个人基本上都讨厌StringTokenizer(为什么?)。

那么,我可以使用什么呢?不建议使用String.split,因为它会复制我的大文本。我需要逐字逐句地查看文本,并在每个非字母上划界。是否更容易自己构建或者是否有一些最佳实践方法来解决这个问题?

提前致谢!

5 个答案:

答案 0 :(得分:3)

StringTokenizer,根据文档"StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead."这几乎总结了StringTokenizer的仇恨。

如果内存确实是一个问题,你可以在字符串之间迭代遍历字符串和子字符串,进行处理,然后继续。

答案 1 :(得分:2)

您可以使用Google Splitter库中的灵活字符串类。

如果您需要更强大的功能,请查看Apache Lucene的StandardTokenizer。 来自文档:

  

这应该是大多数欧洲语言文档的良好标记器:

     
      
  • 在标点字符处拆分单词,删除标点符号。但是,没有空格的点被认为是其中的一部分   一个令牌。
  •   
  • 使用连字符拆分单词,除非令牌中有数字,在这种情况下,整个令牌被解释为产品编号,并且   不分裂。
  •   
  • 将电子邮件地址和互联网主机名识别为一个令牌。
  •   

答案 2 :(得分:1)

你的语法很复杂而你的文件很大,你可以考虑使用JavaCC

当我处于你的情况时,我会使用它。

答案 3 :(得分:0)

Scanner.class逐字(或逐行)读取,可用于大文件(或输入流)。

Pattern for RegEx可以检测空间和许多事情(请查看§,您可以在其中找到类似\ p {..}

的内容

答案 4 :(得分:-1)

我从来不是正则表达式的粉丝,但是对于StringTokenizer使用"[^a-zA-Z]"我没有看到任何问题。