问题 Java使用中的Stanford POS标记


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


12927
2018-03-09 08:02


起源

您似乎在共享内部api,请删除它并提出您的通用问题和所需的异常消息。不是类名。出于安全限制...... - Mohamed Saligh
你可以把解决方案发布到这个吗? - Jack Twain


答案:


我同意Yuval - 一个字符编码问题,但最常见的情况是文件是单字节编码,如ISO-8859-1而标记器试图用UTF-8读取它。请参阅关于U + FFFD的讨论 维基百科


8
2018-03-10 04:39



实际上我并没有给整个文件提供标记。我给出了从文件中提取的句子用于标记。我在我的项目中使用的代码如下:List <Sentence <? extends HasWord >> sentences = MaxentTagger.tokenizeText(new StringReader(string1)); for(Sentence <?extends HasWord> sentence:sentences){Sentence <TaggedWord> tSentence = MaxentTagger.tagSentence(sentence); tag_s1_local = tSentence.toString(假); } - KNsiva
但看起来你的输入字符串中有U + FFFD字符,这通常不会发生,并且似乎反映了字符串编码产生的任何代码中的早期问题。如果你用charAt()逐个打印字符串的字符,你会得到什么? - Christopher Manning
它打印一些句子的原始字符,这些句子没有像!,“,”等字符。但是当它遇到这些字符时会出现问题。 - KNsiva
如果我正确地解释你的上一个评论,这表明在你甚至调用标记器之前,字符串内容都搞乱了。你需要解决这个问题(阅读有关字符编码的内容)。 - Christopher Manning


这对我来说看起来像编码问题。你能发帖吗?我在文档中找不到这个,但我会尝试检查文件是否采用UTF-8编码。


2
2018-03-09 09:06



我从文件中读取并尝试标记后将句子转换为UTF-8格式。对于我来说,只有少数句子没有问题。完成几句后只会出现警告。代码为:String string1 = file_read.readLine( ); byte [] utf81 = string1.getBytes(“UTF-8”); string1 = new String(utf81,“UTF-8”);在此行之后,String1被传递给tagger,正如我在上面的注释中所示。 - KNsiva
阅读你的代码和克里斯托弗曼宁的答案,我相信你是以错误的方式开始的。您的输入文件应该以UTF-8编码开头。如果是单字节编码,则标记器无法恢复原始字符。 - Yuval F
有时最简单的方法是转换输入,但您不需要。任何可识别的编码都可以。但是你试图处理编码的方式看起来完全错误。在Java中,如果将编码提供给InputStreamReader,它将在读取数据时进行转换。您无法使用默认编码读取字符串(无论是什么......),然后尝试将其转换为您想要的字符串,因为如果编码不匹配,它将被读取。您可以通过InputStream读取字节,然后转换为Unicode字符串,但这比必要的更痛苦。 - Christopher Manning


我也遇到过这个问题。测试字符是否可标记的一种方法是检查它是否失败 Character.isIdentifierIgnorable()。无法辨认的角色将返回 true,而所有可标记的字符都将返回 false


1
2017-07-11 21:55





如果您正在阅读DOC,可移植文档格式(PDF)中的内容,请使用 阿帕奇塔卡。它将提取您的内容。它可能对你有所帮助。

阿帕奇塔卡

关于蒂卡

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

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


0
2017-08-01 06:49