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 respuestas
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.
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
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)
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.