2011-02-09 41 views
62

Reconocí que a menudo la respuesta a mi título es ir y leer la documentación, pero me encontré con el NLTK book pero no da la respuesta. Soy algo nuevo para Python.Creando un nuevo corpus con NLTK

Tengo un montón de archivos .txt y quiero poder utilizar las funciones del corpus que proporciona NLTK para el corpus nltk_data.

he tratado PlaintextCorpusReader pero no pude conseguir más allá:

>>>import nltk 
>>>from nltk.corpus import PlaintextCorpusReader 
>>>corpus_root = './' 
>>>newcorpus = PlaintextCorpusReader(corpus_root, '.*') 
>>>newcorpus.words() 

¿Cómo hacer que los segmentos newcorpus frases utilizando Punkt? Intenté usar las funciones punkt pero las funciones punkt no pudieron leer la clase PlaintextCorpusReader?

¿También me puede guiar a cómo puedo escribir los datos segmentados en archivos de texto?

Editar: Esta pregunta tuvo una recompensa una vez, y ahora tiene una segunda recompensa. Ver texto en el cuadro de recompensas.

Respuesta

32

Creo que el PlaintextCorpusReader ya segmenta la entrada con un token de punkt, al menos si el idioma de entrada es el inglés.

PlainTextCorpusReader's constructor

def __init__(self, root, fileids, 
      word_tokenizer=WordPunctTokenizer(), 
      sent_tokenizer=nltk.data.LazyLoader(
       'tokenizers/punkt/english.pickle'), 
      para_block_reader=read_blankline_block, 
      encoding='utf8'): 

puede pasar el lector de una palabra y tokenizer frase, pero para este último el valor por defecto es ya nltk.data.LazyLoader('tokenizers/punkt/english.pickle').

Para una sola cuerda, se usaría un tokenizador de la siguiente manera (explica here, ver la sección 5 para punkt tokenizer).

>>> import nltk.data 
>>> text = """ 
... Punkt knows that the periods in Mr. Smith and Johann S. Bach 
... do not mark sentence boundaries. And sometimes sentences 
... can start with non-capitalized words. i is a good variable 
... name. 
... """ 
>>> tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') 
>>> tokenizer.tokenize(text.strip()) 
+0

gracias por la explicación. Lo tengo. pero ¿cómo puedo generar las oraciones segmentadas en un archivo txt separado? – alvas

+0

Error de ambos enlaces, 404. ¿Algún alma dulce puede actualizar los enlaces? – mtk

+0

Se corrigió el primer enlace. No tengo idea de qué documento utilizaba el segundo. – alexis

9
>>> import nltk 
>>> from nltk.corpus import PlaintextCorpusReader 
>>> corpus_root = './' 
>>> newcorpus = PlaintextCorpusReader(corpus_root, '.*') 
""" 
if the ./ dir contains the file my_corpus.txt, then you 
can view say all the words it by doing this 
""" 
>>> newcorpus.words('my_corpus.txt') 
+0

Dispara un problema para el lenguaje devnagari. – ashim888

44

Después de algunos años de averiguar cómo funciona, aquí está el tutorial actualizada de

Cómo crear un corpus NLTK con un directorio de archivos de texto?

La idea principal es hacer uso del paquete nltk.corpus.reader. En el caso de que tenga un directorio de archivos de texto en English, es mejor usar el PlaintextCorpusReader.

Si usted tiene un directorio que tiene este aspecto:

newcorpus/ 
     file1.txt 
     file2.txt 
     ... 

Simplemente utilice estas líneas de código y se puede obtener un corpus:

import os 
from nltk.corpus.reader.plaintext import PlaintextCorpusReader 

corpusdir = 'newcorpus/' # Directory of corpus. 

newcorpus = PlaintextCorpusReader(corpusdir, '.*') 

NOTA: que el PlaintextCorpusReader utilizará el predeterminado nltk.tokenize.sent_tokenize() y nltk.tokenize.word_tokenize() para dividir sus textos en oraciones y palabras y estas funciones son compilación para inglés, puede NO trabajo para todos idiomas.

Aquí está el código completo con la creación de archivos de texto de prueba y cómo crear un corpus con NLTK y la forma de acceder al corpus en diferentes niveles:

import os 
from nltk.corpus.reader.plaintext import PlaintextCorpusReader 

# Let's create a corpus with 2 texts in different textfile. 
txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" 
txt2 = """Are you a foo bar? Yes I am. Possibly, everyone is.\n""" 
corpus = [txt1,txt2] 

# Make new dir for the corpus. 
corpusdir = 'newcorpus/' 
if not os.path.isdir(corpusdir): 
    os.mkdir(corpusdir) 

# Output the files into the directory. 
filename = 0 
for text in corpus: 
    filename+=1 
    with open(corpusdir+str(filename)+'.txt','w') as fout: 
     print>>fout, text 

# Check that our corpus do exist and the files are correct. 
assert os.path.isdir(corpusdir) 
for infile, text in zip(sorted(os.listdir(corpusdir)),corpus): 
    assert open(corpusdir+infile,'r').read().strip() == text.strip() 


# Create a new corpus by specifying the parameters 
# (1) directory of the new corpus 
# (2) the fileids of the corpus 
# NOTE: in this case the fileids are simply the filenames. 
newcorpus = PlaintextCorpusReader('newcorpus/', '.*') 

# Access each file in the corpus. 
for infile in sorted(newcorpus.fileids()): 
    print infile # The fileids of each file. 
    with newcorpus.open(infile) as fin: # Opens the file. 
     print fin.read().strip() # Prints the content of the file 
print 

# Access the plaintext; outputs pure string/basestring. 
print newcorpus.raw().strip() 
print 

# Access paragraphs in the corpus. (list of list of list of strings) 
# NOTE: NLTK automatically calls nltk.tokenize.sent_tokenize and 
#  nltk.tokenize.word_tokenize. 
# 
# Each element in the outermost list is a paragraph, and 
# Each paragraph contains sentence(s), and 
# Each sentence contains token(s) 
print newcorpus.paras() 
print 

# To access pargraphs of a specific fileid. 
print newcorpus.paras(newcorpus.fileids()[0]) 

# Access sentences in the corpus. (list of list of strings) 
# NOTE: That the texts are flattened into sentences that contains tokens. 
print newcorpus.sents() 
print 

# To access sentences of a specific fileid. 
print newcorpus.sents(newcorpus.fileids()[0]) 

# Access just tokens/words in the corpus. (list of strings) 
print newcorpus.words() 

# To access tokens of a specific fileid. 
print newcorpus.words(newcorpus.fileids()[0]) 

Por último, para leer un directorio de los textos y crear un NLTK corpus en otros idiomas, primero debe asegurarse de que tiene una palabra tokenización pitón se puede llamar y frase tokenización módulos que lleva la secuencia/entrada de la cadena base y produce como salida:

>>> from nltk.tokenize import sent_tokenize, word_tokenize 
>>> txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" 
>>> sent_tokenize(txt1) 
['This is a foo bar sentence.', 'And this is the first txtfile in the corpus.'] 
>>> word_tokenize(sent_tokenize(txt1)[0]) 
['This', 'is', 'a', 'foo', 'bar', 'sentence', '.'] 
+0

Gracias por la aclaración. Sin embargo, muchos idiomas son compatibles por defecto. –

+0

Si alguien obtiene un error 'AttributeError: __exit__'. Use 'open()' en lugar de 'with()' –

+0

@TasdikRahman ¿puede elaborar? No puedo pasar esto ... – yashhy

Cuestiones relacionadas