关于nlp:我如何在python / nltk中使用完整的penn treebank数据集

how could I use complete penn treebank dataset inside python/nltk

我正在尝试学习在python中使用nltk包。特别是,我需要在NLTK中使用Penn树库数据集。据我所知,如果我调用nltk.download('treebank'),我可以得到数据集的5%。但是,我在tar.gz文件中有一个完整的数据集,我想使用它。这里说:

If you have access to a full installation of the Penn Treebank, NLTK
can be configured to load it as well. Download the ptb package, and in
the directory nltk_data/corpora/ptb place the BROWN and WSJ
directories of the Treebank installation (symlinks work as well). Then
use the ptb module instead of treebank:

所以,我从终端打开了python,导入了nltk,并输入了nltk.download('ptb')。使用此命令,在我的~/nltk_data目录下创建了"ptb"目录。最后,我有了~/nltk_data/ptb目录。在那里,正如我在上面给出的链接中建议的那样,我已经把数据集文件夹放在里面了。这是我最后的目录层次结构。

1
2
3
4
5
    $: pwd
    $: ~/nltk_data/corpora/ptb/WSJ
    $: ls
    $:00  02  04  06  08  10  12  14  16  18  20  22  24
      01  03  05  07  09  11  13  15  17  19  21  23  merge.log

在从00到24的所有文件夹中,有许多.mrg文件,如wsj_0001.mrg , wsj_0002.mrg等。

现在,让我们回答我的问题。同样,根据这里:

如果我写下以下内容,我应该能够获得文件ID:

1
2
3
>>> from nltk.corpus import ptb
>>> print(ptb.fileids()) # doctest: +SKIP
['BROWN/CF/CF01.MRG', 'BROWN/CF/CF02.MRG', 'BROWN/CF/CF03.MRG', 'BROWN/CF/CF04.MRG', ...]

不幸的是,当我键入print(ptb.fileids())时,得到了空数组。

1
2
>>> print(ptb.fileids())
[]

有人能帮我吗?

编辑以下是我的ptb目录和allcats.txt文件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
   $: pwd
    $: ~/nltk_data/corpora/ptb
    $: ls
    $: allcats.txt  WSJ
    $: cat allcats.txt
    $: WSJ/00/WSJ_0001.MRG news
    WSJ/00/WSJ_0002.MRG news
    WSJ/00/WSJ_0003.MRG news
    WSJ/00/WSJ_0004.MRG news
    WSJ/00/WSJ_0005.MRG news

    and so on ..

PTB语料库阅读器需要大写的目录和文件名(根据问题中包含的allcats.txt的内容)。这与许多使用小写字母的penn treebank分布相冲突。

解决这个问题的快速方法是将文件夹wsjbrown及其内容重命名为大写。可以用于此目的的UNIX命令是:

1
2
3
4
5
6
7
8
9
10
find . -depth | \
    while read LONG
    do
        SHORT=$( basename"$LONG" | tr '[:lower:]' '[:upper:]' )
        DIR=$( dirname"$LONG" )
        if ["${LONG}" !="${DIR}/${SHORT}"  ]
        then
            mv"${LONG}""${DIR}/${SHORT}"
        fi
    done

(从这个问题中获得)。它将以递归方式将目录和文件名更改为大写。