【问题标题】:Stanford POS tagger in Java usage斯坦福 POS 标注器在 Java 中的使用
【发布时间】:2011-03-09 08:02:21
【问题描述】:
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)
Mar 9, 2011 1:22:06 PM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: � (U+FFFD, decimal: 65533)

这些是我想将 POS 标签分配给句子时遇到的错误。我从文件中读取句子。最初(对于几句话)我没有收到此错误(即无法标记),但在阅读了一些句子后会出现此错误。我使用 POS 标注器的 v2.0(即 2009),型号为 left3words

【问题讨论】:

  • 您似乎共享内部 api,请删除它并输入您的一般问题和所需的异常消息。不是类名。出于安全限制...
  • 能否请您发布解决方案?

标签: java stanford-nlp pos-tagger


【解决方案1】:

我同意 Yuval 的观点——一个字符编码问题,但最常见的情况实际上是文件采用单字节编码(例如 ISO-8859-1),而标记器正试图以 UTF-8 读取它。请参阅Wikipedia 上关于 U+FFFD 的讨论。

【讨论】:

  • 其实我并没有给出一个文件作为一个整体进行标记。我给出了从文件中提取的句子进行标记。我在我的项目中使用的代码如下:List> 句子 = MaxentTagger.tokenizeText(new StringReader(string1)); for (Sentence extends HasWord> sentence : sentence) { Sentence tSentence = MaxentTagger.tagSentence(sentence); tag_s1_local=tSentence.toString(false); }
  • 但是看起来您的输入字符串中包含 U+FFFD 字符,这通常不应该发生,并且似乎反映了在生成该字符串的任何代码中字符编码的早期问题。如果只是用 charAt() 将 String 的字符一个一个打印出来,你会得到什么?
  • 它正在打印一些没有像!,","..等字符的句子的原始字符。但是当它遇到这些字符时就会出现问题。
  • 如果我正确解释了您的最后一条评论,这表明字符串内容在您调用标记器之前就已经搞砸了。你需要解决这个问题(阅读字符编码)。
【解决方案2】:

这对我来说似乎是一个编码问题。你能把冒犯的句子贴出来吗?我在文档中找不到这个,但我会尝试检查文件是否采用 UTF-8 编码。

【讨论】:

  • 在从文件中读取并尝试标记后,我已将句子转换为 UTF-8 格式。最初对我来说几句话没问题。完成几句话后,只会出现警告。代码是:String string1=file_read.readLine(); byte[] utf81 = string1.getBytes("UTF-8"); string1 = new String(utf81, "UTF-8");在此行 String1 传递给标记器之后,如我在上面的评论中所示。
  • 阅读您的代码和 Christopher Manning 的回答后,我相信您以错误的方式开始。您的输入文件应以 UTF-8 编码开头。如果是单字节编码,标注器无法恢复原始字符。
  • 有时最简单的方法是只转换输入,但您不需要。任何公认的编码都可以工作。但是您尝试处理编码的方式看起来完全错误。在 Java 中,如果将编码提供给 InputStreamReader,它将在读取数据时对其进行转换。您无法使用默认编码(无论是什么......)读取字符串,然后尝试将其转换为您想要的,因为如果编码不匹配,它会在读取时搞砸。您可以通过 InputStream 读取字节,然后转换为 Unicode 字符串,但这比必要的更痛苦。
【解决方案3】:

我也遇到了这个问题。测试字符是否可标记的一种方法是检查它是否失败Character.isIdentifierIgnorable()。不可分词的字符将返回true,而所有可分词的字符将返回false

【讨论】:

    【解决方案4】:

    如果您正在阅读来自 DOC、可移植文档格式 (PDF) 的内容,请使用 Apache Tika。它将提取您的内容。它可能会对你有所帮助。

    Apache Tika

    关于蒂卡

    Apache Tika 是一个工具包,用于使用现有的解析器库从各种文档中检测和提取元数据和结构化文本内容。它是用 Java 编写的,但包含一个用于其他语言的命令行版本。

    有关 Tika、错误跟踪器、邮件列表、下载等的更多信息,请访问http://tika.apache.org/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多