Можно ли использовать XMLCorpusReader от NLTK в многофайловом корпусе? - PullRequest
3 голосов
/ 27 июля 2011

Я пытаюсь использовать NLTK для работы с New York Times Annotated Corpus , который содержит XML-файл для каждой статьи (в текстовом формате новостной индустрии NITF).

Я могу анализировать отдельные документы без проблем, вот так:

from nltk.corpus.reader import XMLCorpusReader
reader = XMLCorpusReader('nltk_data/corpora/nytimes/1987/01/01', r'0000000.xml')

Мне нужно работать над всем корпусом.Я попытался сделать это:

reader = XMLCorpusReader('corpora/nytimes', r'.*')

, но это не создает полезного объекта для чтения.Например,

len(reader.words())

возвращает

raise TypeError('Expected a single file identifier string')
TypeError: Expected a single file identifier string

Как мне прочитать этот корпус в NLTK?

Я новичок в NLTK, поэтому любая помощь очень ценится.

Ответы [ 3 ]

5 голосов
/ 27 июля 2011

Я не эксперт по NLTK, поэтому, возможно, есть более простой способ сделать это, но наивно я бы посоветовал вам использовать Python's glob module .Он поддерживает расширение шаблона пути Unix-stle.

from glob import glob
texts = glob('nltk_data/corpora/nytimes/*')

Таким образом, вы получите имена файлов, соответствующих указанному выражению, в форме списка.Затем, в зависимости от того, сколько из них вы хотите / должны открывать одновременно, вы можете сделать:удовлетворить ваши конкретные потребности.

4 голосов
/ 27 июля 2011

Вот решение, основанное на комментарии машинного стремления и парадокса вафли.Создайте список статей, используя glob , и передайте их XMLCorpusReader в виде списка:

from glob import glob
import re
years = glob('nltk_data/corpora/nytimes_test/*')
year_months = []
for year in years:
    year_months += glob(year+'/*')
    print year_months
days = []
for year_month in year_months:
    days += glob(year_month+'/*')
articles = []
for day in days:
    articles += glob(day+'/*.xml')
file_ids = []
for article in articles:
    file_ids.append(re.sub('nltk_data/corpora/nytimes_test','',article))
reader = XMLCorpusReader('nltk_data/corpora/nytimes_test', articles)
3 голосов
/ 27 июля 2011

Да, вы можете указать несколько файлов. (от: http://nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.xmldocs.XMLCorpusReader-class.html)

Проблема здесь в том, что я подозреваю, что все ваши файлы содержатся в файловой структуре в соответствии с corpora/nytimes/year/month/date. XMLCorpusReader не рекурсивно просматривает каталоги для вас. то есть, с вашим кодом выше, XMLCorpusReader('corpora/nytimes', r'.*'), XMLCorpusReader видит только XML-файлы в corpora/nytimes/ (то есть ни в одной, поскольку есть только папки), а не в каких-либо подпапках, которые может содержать corpora/nytimes. Кроме того, вы, вероятно, хотели использовать *.xml в качестве второго параметра.

Я бы рекомендовал самостоятельно обходить папки для построения абсолютных путей (в приведенных выше документах указано, что будут работать явные пути для параметра fileids), или если у вас есть список доступных комбинаций год / месяц / дата, чтобы использовать это в ваших интересах.

...