我已经下载了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()命令即可完成。这是任务的第一部分,我不知道该如何处理。

欢迎提出所有建议。我也特别欢迎提出建议,针对我所想到的方法提出替代的,更有效的方法。

UPDATE :

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
目前是。

最佳答案

您链接到的question有点误导。确实,该代码示例仅读取一个文件,但是nltk的语料库阅读器接口(interface)旨在读取大量文件。读者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一起分发的已解析语料库一样。请注意,由于您有数百万个文件,因此应避免构建句子(甚至文件名)的列表。读者的方法返回“ View ”,即特殊的对象,使您可以迭代并索引结果,而无需将整个结果列表加载到内存中。

关于python - 使用NLTK导入外部树库样式的BLLIP语料库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42634503/

10-12 22:52