CoreNLP PTBTokenizer无法识别:(U+2063,十进制:8291)

mm5n2pyu  于 6个月前  发布在  其他
关注(0)|答案(3)|浏览(66)

PTBTokenizer在处理这个Unicode字符(U+2063,十进制:8291)时崩溃了,这是一个不可见的逗号/分隔符,并抛出了以下错误:
无法标记:⁣ (U+2063,十进制:8291)
异常在线程“main” java.lang.ArithmeticException:整数溢出
at java.lang.Math.toIntExact(Math.java:1011)
at edu.stanford.nlp.process.PTBLexer.getNext(PTBLexer.java)
at edu.stanford.nlp.process.PTBLexer.next(PTBLexer.java)
at edu.stanford.nlp.process.PTBTokenizer.getNext(PTBTokenizer.java:301)
at edu.stanford.nlp.process.PTBTokenizer.getNext(PTBTokenizer.java:185)
at edu.stanford.nlp.process.AbstractTokenizer.hasNext(AbstractTokenizer.java:69)
at edu.stanford.nlp.process.PTBTokenizer.tokReader(PTBTokenizer.java:493)
at edu.stanford.nlp.process.PTBTokenizer.tok(PTBTokenizer.java:464)
at edu.stanford.nlp.process.PTBTokenizer.main(PTBTokenizer.java:890)
还尝试使用-filter \u2063并抛出相同的错误

ybzsozfc

ybzsozfc1#

我认为这两个问题是独立的,只是错误以这种方式打印的巧合。

  1. 我们可以找出与“不可见逗号”有关的事情。目前,“无法标记的”字符应该被删除。您可以通过用这样的字符对一个小文件进行标记来测试这一点;它不应该崩溃。
  2. 文档非常清楚地说明,它将正确处理长度超过Integer.MAX_VALUE个字符的文件,但现在它只是崩溃了。哎呀。
    CoreNLP/src/edu/stanford/nlp/process/PTBLexer.flex
    第483行 in f05cb54
    | | /** 生成下一个标记。 |
kse8i1jr

kse8i1jr2#

我建议只对小于2GB的文件进行分词,直到我们找到解决方案。

5hcedyr0

5hcedyr03#

关于不可见的分隔符:

java edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize -file foo.txt
[main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator tokenize

Processing file /home/john/CoreNLP/foo.txt ... writing to /home/john/CoreNLP/foo.txt.out
Untokenizable: ⁣ (U+2063, decimal: 8291)
Annotating file /home/john/CoreNLP/foo.txt ... done [0.1 sec].

Annotation pipeline timing information:
TokenizerAnnotator: 0.1 sec.
TOTAL: 0.1 sec. for 3 tokens at 56.6 tokens/sec.
Pipeline setup: 0.0 sec.
Total time for StanfordCoreNLP pipeline: 0.2 sec.

cat foo.txt.out
Document: ID=foo.txt (1 sentences, 3 tokens)

Sentence #1 (3 tokens):
Unban⁣mox⁣opal

Tokens:
[Text=Unban CharacterOffsetBegin=0 CharacterOffsetEnd=5]
[Text=mox CharacterOffsetBegin=6 CharacterOffsetEnd=9]
[Text=opal CharacterOffsetBegin=10 CharacterOffsetEnd=14]

请注意,Chrome将不可见的分隔符转换为可见的空格,因此在这里粘贴示例文件相当困难。您可以获得所需的任意数量的不可见分隔符 here ,尽管如此

相关问题