【问题标题】:Extracting tokens from a text file?从文本文件中提取标记?
【发布时间】:2012-04-09 18:56:08
【问题描述】:

我希望能够从文本文件中提取文本作为标记 - 例如,假设我有一个包含以下句子的文本文件:

这是一家不错的餐厅,

相信我!

我想将 this 的内容提取为 'tokens' - 例如,一个令牌将是“It's”,下一个令牌将是“”,之后的一个将是“a”,然后是“”,然后“好”,然后是“餐厅”,然后是“,”和“\n”,然后是“相信”、“”、“我”、“!”。所以我想一种说法是标记要么是单词,要么不是单词。

这是我到目前为止所拥有的(我在程序的其他地方检查标记是否是一个单词,这个方法只返回下一个标记):

public Token next() {
  if (c == -1) {
        throw new NoSuchElementException();
    }

  Writer sw=new CharArrayWriter();
  try {
        while ( c != -1 && Character.isLetter(c) ) {
            sw.write(c);
            c = r.read();
        }
        while ( c != -1 && !Character.isLetter(c)) {
            c = r.read();
        }
    } catch (IOException e) {
        c = -1;
        return null;
    }
    return null;
} 

现在我的返回值为“null”,因为我不确定如何使用编写器将其导出为令牌。有人对此有任何提示吗?谢谢!

【问题讨论】:

    标签: java text token


    【解决方案1】:

    我想使用 Matcher 类的解决方案可以解决您的问题。

    Matcher m = Pattern.compile("\\p{Alpha}+|\\p{Digit}+|\\p{Punct}+|\\p{Space}+").matcher("It's a good restaurant, believe me!");
    while(m.find())
        System.out.println(">"+m.group()+"<");
    

    也许这个正则表达式不是正确的,但你可以构建一个更好的。请参阅以下中的模式文档:

    http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

    【讨论】:

    • 正则表达式确实是一种解决方案,但我认为它只会匹配完全由您提到的字符类之一组成的字符串...您使用了贪婪的量词和一个语句,所以当它找到一系列字母字符,它满足 4 个组中的一个,其他组将被忽略,即使没有匹配整个字符串......我想,我不是真正的正则表达式大师......
    • 挑战在于定义什么是单词的一部分,什么不是。上面的正则表达式是基于不同类别字符的示例。标点符号的一些字符,如撇号,可以加入到 alpha 字符中,解决分隔问题: "[\\p{Alpha}\\']+|\\p{Digit}+|\\p{Punct} +|\\p{Space}+" 确实,每个模式都必须匹配一整组单词、数字、空格等...
    【解决方案2】:

    查看可能适合您需求的 Scanner 类。

    http://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html

    如果您从文件构建扫描程序,则可以使用next() 方法获取令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2018-12-29
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多