【问题标题】:A custom tokenizer for JavaJava的自定义标记器
【发布时间】:2013-07-18 12:46:47
【问题描述】:

我正在开发一个应用程序,我需要在其中处理包含电子邮件的文本文件。我需要文本中的所有标记,以下是标记的定义:

  1. 字母数字
  2. 区分大小写(要保留大小写)
  3. '!'和 '$' 将被视为组成字符。例如:FREE!!$50 是令牌
  4. '.' (dot) 和 ',' 逗号如果出现在数字之间,将被视为组成字符。例如:

    192.168.1.1,24,500 美元

    是令牌。

等等..

请向我推荐一些用于 Java 的开源标记器,这些标记器易于定制以满足我的需求。仅使用 StringTokenizer 和正则表达式就足够了吗?我还必须执行停止,这就是为什么我一直在寻找一个开源标记器,它还将执行一些额外的操作,例如停止、词干提取。

【问题讨论】:

    标签: java token tokenize text-processing text-analysis


    【解决方案1】:

    前面几个cmets:

    StringTokenizer 是为了兼容性而保留的遗留类 原因尽管在新代码中不鼓励使用它。推荐 任何寻求此功能的人都使用 String 的 split 方法 或 java.util.regex 包。

    • 总是use Google 第一 - 目前的第一个结果是JTopas。我没有使用它,但它看起来可以解决这个问题

    至于正则表达式,这实际上取决于您的要求。鉴于上述情况,这可能有效:

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Mkt {
      public static void main(String[] args) {
        Pattern p = Pattern.compile("([$\\d.,]+)|([\\w\\d!$]+)");
        String str = "--- FREE!! $50 192.168.1.1 $24,500";
        System.out.println("input: " + str);
    
        Matcher m = p.matcher(str);
        while(m.find()) {
          System.out.println("token: " + m.group());
        }
      }
    }
    

    这是一个示例运行:

    $ javac Mkt.java && java Mkt
    input: --- FREE!! $50 192.168.1.1 $24,500
    token: FREE!!
    token: $50
    token: 192.168.1.1
    token: $24,500
    

    现在,您可能需要调整正则表达式,例如:

    • 您以$24,500 为例。这是否适用于 $24,500abc$24,500EUR
    • 您提到应该包括192.168.1.1。是否还应包括192,168.1,1(假设., 将被包括在内)?

    我想还有其他事情需要考虑。

    希望这有助于您入门。

    【讨论】:

    • 感谢您的帮助和指导!
    • @stalin 没问题,很高兴为您提供帮助!
    猜你喜欢
    • 2011-04-25
    • 2013-01-09
    • 2019-07-13
    • 2022-07-14
    • 2016-11-18
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多