使用NLTK导入外部树库式BLLIP语料库

Ore*_*ija 9 python parsing nlp corpus nltk

我已经下载了BLLIP语料库,并希望将其导入NLTK.我发现这样做的一种方法是在如何在python中使用NLTK读取已解析句子语料库的问题的答案中描述的 .在那个答案中,他们正在为一个数据文件做这件事.我想为它们的集合做这件事.

BLLIP语料库是几百万个文件的集合,每个文件包含几个解析的句子.包含数据的主文件夹的名称bllip_87_89_wsj,它包含3子文件夹,1987,1988,1989(一年一个).在子文件夹中,1987您有子文件夹,每个子文件夹包含与解析句子对应的多个文件.子文件夹的名称类似于w7_001(对于文件夹1987),文件名是w7_001.000,w7_001.001等等.

有了这一切,我的任务如下:使用NLTK解析器顺序读取所有文件.然后,将语料库转换为列表列表,其中每个子列表都是一个句子.

第二部分很简单,它完成了命令corpus_name.sents().这是我不知道如何处理的任务的第一部分.

欢迎所有建议.我还特别欢迎那些提出替代的,更有效的方法的建议.

更新:

BLLIP语料库的解析句子具有以下形式:

(S (NP (DT the) (JJ little) (NN dog)) (VP (VBD barked)))
Run Code Online (Sandbox Code Playgroud)

在许多句子中有一个句法的句法范畴,(-NONE- *-0)所以当我读到语料库*-0被认为是一个单词.有没有办法忽略句法类别-NONE-.例如,如果我有句子

(S (NP-SBJ (-NONE- *-0))
  (VP (TO to)
   (VP (VB sell)
    (NP (NP (PRP$#0 its) (NN TV) (NN station))
     (NN advertising)
     (NN representation)
     (NN operation)
     (CC and)
     (NN program)
     (NN production)
     (NN unit))
Run Code Online (Sandbox Code Playgroud)

我希望它成为:

to sell its TV station advertising representation operation and program production unit

并不是

*-0 to sell its TV station advertising representation operation and program production unit

它是目前的.

ale*_*xis 5

你链接的问题只是有点误导.事实上,该代码示例只读取一个文件,但该nltk语料库读取器接口专为读取大量文件而设计.读者构造函数的必需参数是语料库的基本文件夹的路径,以及匹配应该读入的所有文件名的正则表达式(普通的,不是"glob").所以只需调整问题的答案通过添加适当的正则表达式.(如果语料库与BracketParseCorpusReader默认值不匹配,还要添加格式选项.)例如:

from nltk.corpus.reader import BracketParseCorpusReader
reader = BracketParseCorpusReader('path/to/bllip_87_89_wsj', r'.*/w\d_.*')
Run Code Online (Sandbox Code Playgroud)

这将匹配任何子文件w<digit>_夹中名称以...开头的文件.如果您碰巧拥有与此模式匹配但必须排除的文件(例如w7_001.001-old:),则可以锐化上述正则表达式.

您可以使用此语料库阅读器,就像您使用与nltk一起分发的已分析语料库一样.请注意,由于您有数百万个文件,因此应避免构建句子列表(甚至是文件名).读者的方法返回"视图",这些特殊对象允许您迭代并索引结果,而无需将整个结果列表加载到内存中.