Estoy tratando de utilizar NLTK que hacer algún trabajo en el Corpus anotado del New York Times que contiene un archivo XML para cada artículo (en el formato de texto News Industry NITF).

Puedo analizar documentos individuales sin ningún problema así:

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

Aunque necesito trabajar en todo el corpus. Intenté hacer esto:

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

Pero esto no crea un objeto lector utilizable. Por ejemplo

len(reader.words())

Devuelve

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

¿Cómo leo este corpus en NLTK?

Soy nuevo en NLTK, por lo que cualquier ayuda es muy apreciada.

3
NAD 27 jul. 2011 a las 02:52

3 respuestas

La mejor respuesta

No soy un experto en NLTK, por lo que puede haber una manera más fácil de hacerlo, pero ingenuamente sugeriría que use módulo glob de Python. Admite la expansión del patrón de nombre de ruta Unix-stle.

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

Entonces eso le daría los nombres de los archivos que coinciden con la expresión especificada, en forma de lista. Luego, dependiendo de cuántos de ellos desee / necesite tener abiertos a la vez, puede hacer:

from nltk.corpus.reader import XMLCorpusReader
for item_path in texts:
    reader = XMLCorpusReader('nltk_data/corpora/nytimes/', item_path)

Como lo sugiere @waffle paradox :, también puede reducir esta lista de texts para satisfacer sus necesidades específicas.

5
syg 16 sep. 2012 a las 03:49

Sí, puede especificar varios archivos. (de: http: // nltk.googlecode.com/svn/trunk/doc/api/nltk.corpus.reader.xmldocs.XMLCorpusReader-class.html)

El problema aquí es que sospecho que todos sus archivos están contenidos en una estructura de archivos a lo largo de las líneas de corpora/nytimes/year/month/date. XMLCorpusReader no recorre recursivamente los directorios por usted. es decir, con su código anterior, XMLCorpusReader('corpora/nytimes', r'.*'), XMLCorpusReader solo ve los archivos xml en corpora/nytimes/ (es decir, ninguno, ya que solo hay carpetas), no en ninguna subcarpeta que corpora/nytimes pueda contener. Además, probablemente quisiste usar *.xml como tu segundo parámetro.

Recomendaría recorrer las carpetas usted mismo para crear rutas absolutas (los documentos anteriores especifican que las rutas explícitas para el parámetro fileids funcionarán), o si tiene una lista de combinaciones de año / mes / fecha disponibles, para usar eso para tu ventaja

3
waffle paradox 26 jul. 2011 a las 23:55

Aquí está la solución basada en el anhelo de la máquina y los comentarios de la paradoja de los gofres. Cree una lista de artículos utilizando glob y páselos a XMLCorpusReader como una lista:

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)
4
NAD 27 jul. 2011 a las 15:27