Leitores de Corpus e Corpora Personalizados
O que é um corpus?
Um corpus é uma grande coleção, em formato estruturado, de textos legíveis por máquina que foram produzidos em um ambiente comunicativo natural. A palavra Corpora é o plural de Corpus. Corpus pode ser derivado de várias maneiras, como segue -
- Do texto que era originalmente eletrônico
- Das transcrições da língua falada
- Do reconhecimento óptico de caracteres e assim por diante
Representatividade do Corpus, Equilíbrio do Corpus, Amostragem, Tamanho do Corpus são os elementos que desempenham um papel importante na concepção do corpus. Alguns dos corpus mais populares para tarefas de PNL são TreeBank, PropBank, VarbNet e WordNet.
Como construir corpus customizado?
Durante o download do NLTK, também instalamos o pacote de dados do NLTK. Portanto, já temos o pacote de dados NLTK instalado em nosso computador. Se falarmos sobre o Windows, vamos supor que este pacote de dados está instalado emC:\natural_language_toolkit_data e se falarmos sobre Linux, Unix e Mac OS X, vamos assumir que este pacote de dados está instalado em /usr/share/natural_language_toolkit_data.
Na seguinte receita do Python, vamos criar corpora customizados que devem estar dentro de um dos caminhos definidos por NLTK. É assim porque pode ser encontrado pelo NLTK. Para evitar conflito com o pacote de dados oficial NLTK, vamos criar um diretório natural_language_toolkit_data personalizado em nosso diretório inicial.
import os, os.path
path = os.path.expanduser('~/natural_language_toolkit_data')
if not os.path.exists(path):
os.mkdir(path)
os.path.exists(path)
Resultado
True
Agora, vamos verificar se temos o diretório natural_language_toolkit_data em nosso diretório inicial ou não -
import nltk.data
path in nltk.data.path
Resultado
True
Como temos a saída True, significa que temos nltk_data diretório em nosso diretório inicial.
Agora faremos um arquivo de lista de palavras, chamado wordfile.txt e colocá-lo em uma pasta, chamada corpus em nltk_data diretório (~/nltk_data/corpus/wordfile.txt) e irá carregá-lo usando nltk.data.load -
import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)
Resultado
b’tutorialspoint\n’
Leitores corpus
O NLTK oferece várias classes CorpusReader. Vamos abordá-los nas seguintes receitas de python
Criando um corpus de lista de palavras
NLTK tem WordListCorpusReaderclasse que fornece acesso ao arquivo que contém uma lista de palavras. Para a seguinte receita do Python, precisamos criar um arquivo de lista de palavras que pode ser CSV ou arquivo de texto normal. Por exemplo, criamos um arquivo chamado 'lista' que contém os seguintes dados -
tutorialspoint
Online
Free
Tutorials
Agora vamos instanciar um WordListCorpusReader classe produzindo a lista de palavras de nosso arquivo criado ‘list’.
from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()
Resultado
['tutorialspoint', 'Online', 'Free', 'Tutorials']
Criação de corpus de palavras marcadas em PDV
NLTK tem TaggedCorpusReaderclasse com a ajuda da qual podemos criar um corpus de palavras marcadas POS. Na verdade, a marcação de POS é o processo de identificar a etiqueta da classe gramatical para uma palavra.
Um dos formatos mais simples para um corpus marcado é no formato 'palavra / tag', como o trecho do corpus marrom -
The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.
No trecho acima, cada palavra possui uma tag que denota seu PDV. Por exemplo,vb refere-se a um verbo.
Agora vamos instanciar um TaggedCorpusReaderclasse que produz palavras marcadas em POS formam o arquivo ‘list.pos’, que contém o trecho acima.
from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()
Resultado
[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]
Criando um corpus de frase fragmentada
NLTK tem ChnkedCorpusReaderclasse com a ajuda da qual podemos criar um corpus de frases fragmentadas. Na verdade, um pedaço é uma frase curta em uma frase.
Por exemplo, temos o seguinte trecho do treebank corpus -
[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.
No trecho acima, cada bloco é um sintagma nominal, mas as palavras que não estão entre colchetes fazem parte da árvore de frases e não de nenhuma subárvore do sintagma nominal.
Agora vamos instanciar um ChunkedCorpusReader classe produzindo frase fragmentada do arquivo ‘list.chunk’, que contém o trecho acima.
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()
Resultado
[
Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
('have', 'VBP'), ...
]
Criação de corpus de texto categorizado
NLTK tem CategorizedPlaintextCorpusReaderclasse com a ajuda da qual podemos criar um corpus de texto categorizado. É muito útil no caso em que temos um grande corpus de texto e queremos categorizá-lo em seções separadas.
Por exemplo, o corpus marrom tem várias categorias diferentes. Vamos descobri-los com a ajuda do seguinte código Python -
from nltk.corpus import brown^M
brown.categories()
Resultado
[
'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
'reviews', 'romance', 'science_fiction'
]
Uma das maneiras mais fáceis de categorizar um corpus é ter um arquivo para cada categoria. Por exemplo, vamos ver os dois trechos domovie_reviews corpus -
movie_pos.txt
A fina linha vermelha é falha, mas provoca.
movie_neg.txt
Uma produção brilhante e de grande orçamento não pode compensar a falta de espontaneidade que permeia seu programa de TV.
Portanto, dos dois arquivos acima, temos duas categorias a saber pos e neg.
Agora vamos instanciar um CategorizedPlaintextCorpusReader classe.
from nltk.corpus.reader import CategorizedPlaintextCorpusReader
reader_corpus = CategorizedPlaintextCorpusReader('.', r'movie_.*\.txt',
cat_pattern = r'movie_(\w+)\.txt')
reader_corpus.categories()
reader_corpus.fileids(categories = [‘neg’])
reader_corpus.fileids(categories = [‘pos’])
Resultado
['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']