Импорт внешнего корпуса BLLIP в стиле treebank с использованием NLTK

Я загрузил корпус BLLIP и хочу импортировать его в NLTK. Один из способов, который я нашел для этого, описан в ответе на вопрос Как читать корпус проанализированных предложений с помощью NLTK в python?. В этом ответе они делают это для одного файла данных. Я хочу сделать это для их коллекции.

Корпус 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)))

В ряде предложений есть синтаксическая категория формы (-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

который сейчас.


person Orest Xherija    schedule 06.03.2017    source источник
comment
Орест, твое обновление - это совсем другой вопрос. Вы должны были спросить об этом отдельно. Но на самом деле это дубликат этого вопроса, на который вы найдете ответ.   -  person alexis    schedule 27.03.2017


Ответы (1)


вопрос, на который вы ссылаетесь, просто небольшое заблуждение. Действительно, этот образец кода читает только один файл, но интерфейс чтения корпуса nltk предназначен для чтения больших коллекций файлов. Обязательными аргументами для читателя конструктора являются путь в базовую папку корпуса и регулярное выражение (обычное, а не «глобус»), которое соответствует всем именам файлов, которые должны быть прочитаны. Так что просто адаптируйте ответ на вопрос, добавив соответствующее регулярное выражение. (Также добавьте параметры формата, если ваш корпус не соответствует 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. Обратите внимание: поскольку у вас миллионы файлов, вам следует избегать построения списка предложений (или даже имен файлов). Методы читателя возвращают «представления», специальные объекты, которые позволяют выполнять итерацию и индексировать результаты без загрузки всего списка результатов в память.

person alexis    schedule 07.03.2017