Corpus Reader e Custom Corpora
Cos'è un corpus?
Un corpus è una vasta raccolta, in formato strutturato, di testi leggibili da una macchina che sono stati prodotti in un contesto comunicativo naturale. La parola Corpora è il plurale di Corpus. Il corpo può essere derivato in molti modi come segue:
- Dal testo che era originariamente elettronico
- Dalle trascrizioni della lingua parlata
- Dal riconoscimento ottico dei caratteri e così via
Rappresentatività del corpo, Bilanciamento del corpo, Campionamento, Dimensione del corpo sono gli elementi che giocano un ruolo importante durante la progettazione del corpus. Alcuni dei corpus più popolari per le attività di PNL sono TreeBank, PropBank, VarbNet e WordNet.
Come costruire corpus personalizzati?
Durante il download di NLTK, abbiamo anche installato il pacchetto dati NLTK. Quindi, abbiamo già il pacchetto dati NLTK installato sul nostro computer. Se parliamo di Windows, presumeremo che questo pacchetto di dati sia installato inC:\natural_language_toolkit_data e se parliamo di Linux, Unix e Mac OS X, assumeremo che questo pacchetto di dati sia installato in /usr/share/natural_language_toolkit_data.
Nella seguente ricetta Python, creeremo corpora personalizzati che devono essere all'interno di uno dei percorsi definiti da NLTK. È così perché può essere trovato da NLTK. Per evitare conflitti con il pacchetto dati NLTK ufficiale, creiamo una directory natural_language_toolkit_data personalizzata nella nostra directory home.
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)
Produzione
True
Ora, controlliamo se abbiamo la directory natural_language_toolkit_data nella nostra directory home oppure no -
import nltk.data
path in nltk.data.path
Produzione
True
Dato che abbiamo l'output True, significa che lo abbiamo nltk_data directory nella nostra home directory.
Ora creeremo un file di elenco di parole, denominato wordfile.txt e inseriscilo in una cartella, denominata corpus in nltk_data directory (~/nltk_data/corpus/wordfile.txt) e lo caricherà usando nltk.data.load -
import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)
Produzione
b’tutorialspoint\n’
Lettori di corpus
NLTK fornisce varie classi CorpusReader. Li copriremo nelle seguenti ricette di Python
Creazione del corpus di elenchi di parole
NLTK ha WordListCorpusReaderclasse che fornisce l'accesso al file contenente un elenco di parole. Per la seguente ricetta Python, dobbiamo creare un file elenco di parole che può essere CSV o un normale file di testo. Ad esempio, abbiamo creato un file denominato "list" che contiene i seguenti dati:
tutorialspoint
Online
Free
Tutorials
Ora istanziamo un file WordListCorpusReader classe che produce l'elenco di parole dal nostro file creato ‘list’.
from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()
Produzione
['tutorialspoint', 'Online', 'Free', 'Tutorials']
Creazione di un corpus di parole con tag POS
NLTK ha TaggedCorpusReadercon l'aiuto del quale possiamo creare un corpus di parole con tag POS. In realtà, il tagging POS è il processo di identificazione del tag di parte del discorso per una parola.
Uno dei formati più semplici per un corpus taggato è della forma 'parola / tag' come segue un estratto dal corpus marrone -
The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.
Nell'estratto sopra, ogni parola ha un tag che denota il suo POS. Per esempio,vb si riferisce a un verbo.
Ora istanziamo un file TaggedCorpusReaderclasse che produce parole con tag POS formano il file ‘list.pos’, che contiene l'estratto di cui sopra.
from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()
Produzione
[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]
Creazione di corpus di frasi in blocchi
NLTK ha ChnkedCorpusReaderclass con l'aiuto del quale possiamo creare un corpus di frasi Chunked. In realtà, un pezzo è una breve frase in una frase.
Ad esempio, abbiamo il seguente estratto dal tag 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 ./.
Nell'estratto sopra, ogni parte è una frase nominale, ma le parole che non sono tra parentesi fanno parte dell'albero della frase e non fanno parte di alcun sottoalbero della frase nominale.
Ora istanziamo un file ChunkedCorpusReader classe che produce una frase in blocchi dal file ‘list.chunk’, che contiene l'estratto di cui sopra.
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()
Produzione
[
Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
('have', 'VBP'), ...
]
Creazione di corpus di testo categorizzato
NLTK ha CategorizedPlaintextCorpusReaderclasse con l'aiuto del quale possiamo creare un corpus di testo categorizzato. È molto utile nel caso in cui disponiamo di un ampio corpus di testo e desideriamo classificarlo in sezioni separate.
Ad esempio, il corpus marrone ha diverse categorie diverse. Cerchiamo di scoprirli con l'aiuto del seguente codice Python -
from nltk.corpus import brown^M
brown.categories()
Produzione
[
'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
'reviews', 'romance', 'science_fiction'
]
Uno dei modi più semplici per classificare un corpus è disporre di un file per ogni categoria. Ad esempio, vediamo i due estratti dalmovie_reviews corpus -
movie_pos.txt
La sottile linea rossa è imperfetta ma provoca.
movie_neg.txt
Una produzione ad alto budget e patinata non può sopperire alla mancanza di spontaneità che permea il loro programma televisivo.
Quindi, dall'alto di due file, abbiamo due categorie, vale a dire pos e neg.
Ora istanziamo un file 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’])
Produzione
['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']