使用NLTK

时间:2017-03-06 20:00:20

标签: python parsing nlp nltk corpus

我已下载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

目前。

1 个答案:

答案 0 :(得分:5)

您链接的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一起分发的已解析语料库一样。请注意,由于您有数百万个文件,因此应避免构建句子列表(甚至是文件名)。读者的方法返回&#34; views&#34;,这些特殊对象允许您迭代并索引结果,而无需将整个结果列表加载到内存中。