Encoding 如何对中文文本使用斯坦福词法分析器?

Encoding 如何对中文文本使用斯坦福词法分析器?,encoding,utf-8,nlp,stanford-nlp,Encoding,Utf 8,Nlp,Stanford Nlp,我似乎无法获得正确的输入编码 如何使用斯坦福词法分析器处理中文文本? 为了下载该工具,我做了以下工作: $ wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip $ unzip stanford-parser-full-2015-04-20.zip $ cd stanford-parser-full-2015-04-20/ 我的输入文本位于UTF-8: $ echo "应有尽有 的 丰富 选择 定

我似乎无法获得正确的输入编码

如何使用斯坦福词法分析器处理中文文本?

为了下载该工具,我做了以下工作:

$ wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip
$ unzip stanford-parser-full-2015-04-20.zip 
$ cd stanford-parser-full-2015-04-20/
我的输入文本位于
UTF-8

$ echo "应有尽有 的 丰富 选择 定 将 为 您 的 旅程 增添 无数 的 赏心 乐事 。" > input.txt

$ echo "应有尽有#VV 的#DEC 丰富#JJ 选择#NN 定#VV 将#AD 为#P 您#PN 的#DEG 旅程#NN 增添#VV 无数#CD 的#DEG 赏心#NN 乐事#NN  。#PUNCT" > pos-input.txt
根据
README.txt
,解析器接受了以下方面的培训:

中国人 有些汉语语法只是根据大陆的材料训练的 来自新华社和LDC中国树库的更多混合材料。这个 默认输入编码为GB18030

因此,我首先尝试使用
UTF-8
文件:

$ bash lexparser-lang.sh Chinese 80 edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz parsed input.txt
Loading parser from serialized file edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz ...  done [1.0 sec].
Parsing file: input.txt
Parsing [sent. 1 len. 16]: 应有尽有 的1�7 丰富 选择 宄1�7 射1�7 丄1�7 悄1�7 的1�7 旅程 增添 无数 的1�7 赏心 乐事 〄1�7
Parsed file: input.txt [1 sentences].
Parsed 16 words in 1 sentences (21.00 wds/sec; 1.31 sents/sec).
它似乎不起作用。解析器生成了这个文件,
input.txt.parsed.80.stp

[out]:

$ cat input.txt.parsed.80.stp 
(FRAG (NR 应有尽有) (NR 的1�7) (NT 丰富) (NT 选择) (NN 宄1�7) (NN 射1�7) (NN 丄1�7) (NN 悄1�7) (NR 的1�7) (NT 旅程) (NT 增添) (NN 无数) (NN 的1�7) (NR 赏心) (NR 乐事) (VV 〄1�7))
然后我试着把这个句子编码成GB18030:

$ bash lexparser-lang.sh Chinese 80 edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz parsed input-gb18030.txt
Loading parser from serialized file edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz ...  done [1.0 sec].
Parsing file: input-gb18030.txt
Parsing [sent. 1 len. 16]: Ӧ�о��� �� �ḻ ѡ�� �� �� Ϊ �� �� �ó� ���� ���� �� ���� ���� ��
Parsed file: input-gb18030.txt [1 sentences].
Parsed 16 words in 1 sentences (19.90 wds/sec; 1.24 sents/sec).
alvas@ubi:~/stanford-parser-full-2015-04-20$ cat input-gb18030.txt.parsed.80.stp 
(IP
  (NP
    (CP
      (IP
        (VP (VV Ӧ�о���)))
      (DEC ��))
    (ADJP (JJ �ḻ))
    (NP (NN ѡ��)))
  (VP (VV ��)
    (VP
      (ADVP (AD ��))
      (PP (P Ϊ)
        (NP
          (DNP
            (NP (PN ��))
            (DEG ��))
          (NP (NN �ó�))))
      (VP (VV ����)
        (NP
          (DNP
            (ADJP (JJ ����))
            (DEG ��))
          (NP (NN ����) (NN ����))))))
  (PU ��))
它似乎正在工作,但如何将文件转换回UTF8?

我尝试过这个,但没有成功:

$ cat input-gb18030.txt.parsed.80.stp | python -c "print raw_input().decode('GB18030').encode('utf8')"
(IP
以下是一些结论性问题:

  • 如何将GB18030转换为UTF8,以及如何将UTF8转换为GB18030?
  • 如何使用斯坦福词法分析器处理中文UTF8文本?

我遵循了您的步骤,它表明您可以简单地使用编码转换器来实现您的目标

我在测试中使用了
iconv

iconv -f GB18030 -t UTF-8 input2.txt.parsed.80.stp -o output
以下是我的输出:

dmk@dmk-debian /t/stanford-parser-full-2015-04-20 ❯❯❯ cat input2.txt.parsed.80.stp
(IP
  (NP
    (CP
      (IP
        (VP (VV Ӧ�о���)))
      (DEC ��))
    (ADJP (JJ �ḻ))
    (NP (NN ѡ��)))
  (VP (VV ��)
    (VP
      (ADVP (AD ��))
      (PP (P Ϊ)
        (NP
          (DNP
            (NP (PN ��))
            (DEG ��))
          (NP (NN �ó�))))
      (VP (VV ����)
        (NP
          (DNP
            (ADJP (JJ ����))
            (DEG ��))
          (NP (NN ����) (NN ����))))))
  (PU ��))

dmk@dmk-debian /t/stanford-parser-full-2015-04-20 ❯❯❯ iconv -f GB18030 -t UTF-8 input2.txt.parsed.80.stp -o output
dmk@dmk-debian /t/stanford-parser-full-2015-04-20 ❯❯❯ cat output
(IP
  (NP
    (CP
      (IP
        (VP (VV 应有尽有)))
      (DEC 的))
    (ADJP (JJ 丰富))
    (NP (NN 选择)))
  (VP (VV 定)
    (VP
      (ADVP (AD 将))
      (PP (P 为)
        (NP
          (DNP
            (NP (PN 您))
            (DEG 的))
          (NP (NN 旅程))))
      (VP (VV 增添)
        (NP
          (DNP
            (ADJP (JJ 无数))
            (DEG 的))
          (NP (NN 赏心) (NN 乐事))))))
  (PU 。))

我不确定stackoverflow是否弄乱了您粘贴的文本的编码,但您声称从utf8编码到GB18030的文本不在GB18030工具中,这是可行的!但我输入UTF8得到GB18030有点疯狂,然后我必须重新编码GB18030得到UTF8。你知道为什么incov可以工作,但是python
line.decode(
).encode('GB18030').encode('UTF8')不能工作吗?@alvas
raw_input()
只读取stdin中的一行,所以你只得到了
IP(
)。我查阅了python手册,找到了以下直到stdin结束的解决方案:
cat input2.txt.parsed.80.stp | python-c“导入系统;打印系统.stdin.read().解码('GB18030')。编码('utf8')”