Création d'un nouveau corpus avec NLTK

J'ai compté que souvent la réponse à mon titre est d'aller lire les documentations, mais j'ai parcouru le livre NLTK mais il ne donne pas la réponse. Je suis un peu nouveau en python.

J'ai un tas de fichiers .txt et je veux pouvoir utiliser les fonctions de corpus fournies par NLTK pour le corpus nltk_data.

J'ai essayé PlaintextCorpusReader, mais je ne pouvais pas aller plus loin que:

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

Comment segmenter les phrases newcorpus en utilisant punkt? J'ai essayé d'utiliser les fonctions punkt mais le les fonctions punkt ne pouvaient pas lire la classe PlaintextCorpusReader?

Pouvez-vous aussi me conduire à la façon dont je peux écrire les données segmentées en fichiers texte?

Modifier: Cette question avait une prime une fois, et elle a maintenant une deuxième prime. Voir le texte dans la boîte de primes.

71
demandé sur projectdp 2011-02-10 02:19:48

3 réponses

Je pense que le PlaintextCorpusReader segmente déjà l'entrée avec un tokenizer punkt, au moins si votre langue d'entrée est l'anglais.

Constructeur de PlainTextCorpusReader

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'):

Vous pouvez passer au lecteur un tokenizer de mots et de phrases, mais pour ce dernier la valeur par défaut est déjà nltk.data.LazyLoader('tokenizers/punkt/english.pickle').

Pour une seule chaîne, un tokenizer serait utilisé comme suit (expliqué ici, voir la section 5 pour 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())
37
répondu Reiner Gerecke 2017-10-31 17:54:58

Après quelques années de comprendre comment cela fonctionne, voici le tutoriel mis à jour de

Comment créer un corpus NLTK avec un répertoire de fichiers de texte?

L'idée principale est de faire usage de la nltk.corpus.lecteur paquet. Dans le cas que vous avez un répertoire de fichiers texte dans anglais, il est préférable d'utiliser le PlaintextCorpusReader.

Si vous avez un répertoire qui ressemble à ceci:

newcorpus/
         file1.txt
         file2.txt
         ...

Utilisez simplement ces lignes de code et vous pouvez obtenir un corpus:

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

corpusdir = 'newcorpus/' # Directory of corpus.

newcorpus = PlaintextCorpusReader(corpusdir, '.*')

NOTE: que le PlaintextCorpusReader utilisera les nltk.tokenize.sent_tokenize() et nltk.tokenize.word_tokenize() par défaut pour diviser vos textes en phrases et en mots et que ces fonctions sont construites pour l'anglais, il se peut que ne fonctionne pas pour toutes les langues.

Voici le code complet avec la création de fichiers de texte de test et comment créer un corpus avec NLTK et comment accéder au corpus à différents niveaux:

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])

Enfin, pour lire un répertoire de textes et créer un NLTK corpus dans un autre langage, vous devez d'abord vous assurer que vous avez un module Python-callable word tokenization et phrase tokenization qui prend l'entrée string / basestring et produit une telle sortie:

>>> 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', '.']
52
répondu alvas 2014-01-04 15:04:10
 >>> 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')
10
répondu Krolique 2014-01-04 22:18:37