【问题标题】:Importing external treebank-style BLLIP corpus using NLTK使用 NLTK 导入外部树库样式 BLLIP 语料库
【发布时间】:2026-01-25 06:45:01
【问题描述】:

我已经下载了BLLIP 语料库,并希望将其导入到 NLTK。我发现这样做的一种方法在问题的答案中进行了描述 How to read corpus of parsed sentences using NLTK in python?。在那个答案中,他们正在为一个数据文件做这件事。我想为它们做一个集合。

BLLIP 语料库是由几百万个文件组成的集合,每个文件都包含几个已解析的句子左右。包含数据的主文件夹名为 bllip_87_89_wsj,它包含 3 个子文件夹,198719881989(每年一个)。在子文件夹1987 中,您有子子文件夹,每个子文件夹都包含许多与已解析句子相对应的文件。子文件夹命名为 w7_001(用于文件夹 1987),文件名为 w7_001.000w7_001.001 等等。

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

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

欢迎所有建议。我也特别欢迎提出替代、更有效的方法的建议。

更新

BLLIP语料库的解析句子形式如下:

(S (NP (DT the) (JJ little) (NN dog)) (VP (VBD barked)))

在许多句子中都有(-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))

我希望它变成:

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

目前是什么。

【问题讨论】:

  • Orest,您的“更新”是一个完全不同的问题。你应该单独问。但它实际上是 this question 的副本,您可以在其中找到答案。

标签: python parsing nlp nltk corpus


【解决方案1】:

您链接到的question 只是有点误导。实际上,该代码示例只读取一个文件,但nltk 的语料库阅读器界面是为阅读大量文件而设计的。读者constructor 的强制性参数是语料库基本文件夹的路径和一个匹配所有应该读入的文件名的正则表达式(一个普通的,而不是“glob”)。所以只需适应the answer通过添加适当的正则表达式来解决问题。 (如果您的语料库与BracketParseCorpusReader 默认值不匹配,还可以添加格式选项。)例如:

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

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

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

【讨论】: