Czytniki Corpus i Custom Corpora
Co to jest korpus?
Korpus to duży zbiór, w ustrukturyzowanym formacie, tekstów do odczytu maszynowego, które zostały stworzone w naturalnym środowisku komunikacyjnym. Słowo Corpora jest liczbą mnogą od Corpus. Korpus można wyprowadzić na wiele sposobów w następujący sposób -
- Z tekstu, który był pierwotnie elektroniczny
- Z transkrypcji języka mówionego
- Od optycznego rozpoznawania znaków i tak dalej
Reprezentatywność korpusu, balans korpusu, próbkowanie, rozmiar korpusu to elementy, które odgrywają ważną rolę podczas projektowania korpusu. Do najpopularniejszych korpusów zadań NLP należą TreeBank, PropBank, VarbNet i WordNet.
Jak zbudować niestandardowy korpus?
Podczas pobierania NLTK zainstalowaliśmy również pakiet danych NLTK. Tak więc mamy już zainstalowany pakiet danych NLTK na naszym komputerze. Jeśli mówimy o systemie Windows, zakładamy, że ten pakiet danych jest zainstalowany wC:\natural_language_toolkit_data a jeśli mówimy o Linuksie, Uniksie i Mac OS X, założymy, że ten pakiet danych jest zainstalowany w /usr/share/natural_language_toolkit_data.
W poniższym przepisie Pythona utworzymy niestandardowe korpusy, które muszą znajdować się w jednej ze ścieżek zdefiniowanych przez NLTK. Dzieje się tak, ponieważ można go znaleźć NLTK. Aby uniknąć konfliktu z oficjalnym pakietem danych NLTK, utwórzmy niestandardowy katalog natural_language_toolkit_data w naszym katalogu domowym.
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)
Wynik
True
Teraz sprawdźmy, czy mamy katalog natural_language_toolkit_data w naszym katalogu domowym, czy nie -
import nltk.data
path in nltk.data.path
Wynik
True
Ponieważ otrzymaliśmy wynik True, oznacza, że mamy nltk_data katalogu w naszym katalogu domowym.
Teraz utworzymy plik listy słów o nazwie wordfile.txt i umieść go w folderze o nazwie corpus in nltk_data informator (~/nltk_data/corpus/wordfile.txt) i załaduje go za pomocą nltk.data.load -
import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)
Wynik
b’tutorialspoint\n’
Czytelnicy Corpus
NLTK udostępnia różne klasy CorpusReader. Omówimy je w poniższych przepisach na Pythona
Tworzenie korpusu listy słów
NLTK ma WordListCorpusReaderklasa, która zapewnia dostęp do pliku zawierającego listę słów. W przypadku poniższego przepisu w Pythonie musimy utworzyć plik listy słów, który może być plikiem CSV lub zwykłym plikiem tekstowym. Na przykład utworzyliśmy plik o nazwie „lista”, który zawiera następujące dane -
tutorialspoint
Online
Free
Tutorials
Teraz stwórzmy instancję WordListCorpusReader klasa tworząca listę słów z naszego utworzonego pliku ‘list’.
from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()
Wynik
['tutorialspoint', 'Online', 'Free', 'Tutorials']
Tworzenie korpusu słów ze znacznikami POS
NLTK ma TaggedCorpusReaderclass za pomocą której możemy stworzyć korpus słów tagowanych POS. W rzeczywistości znakowanie POS to proces identyfikacji znacznika części mowy dla słowa.
Jednym z najprostszych formatów otagowanego korpusu jest forma „słowo / tag”, podobnie jak następujący fragment z brązowego korpusu -
The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.
W powyższym fragmencie każde słowo ma tag, który oznacza jego POS. Na przykład,vb odnosi się do czasownika.
Teraz stwórzmy instancję TaggedCorpusReaderklasa produkująca słowa oznaczone tagami POS z pliku ‘list.pos’, który zawiera powyższy fragment.
from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()
Wynik
[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]
Tworzenie fragmentów korpusu fraz
NLTK ma ChnkedCorpusReaderclass za pomocą której możemy stworzyć korpus fraz Chunked. W rzeczywistości kawałek to krótkie wyrażenie w zdaniu.
Na przykład mamy następujący fragment z tagged treebank korpus -
[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.
W powyższym fragmencie każdy fragment jest frazą rzeczownikową, ale słowa, które nie są w nawiasach, są częścią drzewa zdań, a nie częścią żadnego poddrzewa wyrażenia rzeczownikowego.
Teraz stwórzmy instancję ChunkedCorpusReader klasa tworząca fragmentowaną frazę z pliku ‘list.chunk’, który zawiera powyższy fragment.
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()
Wynik
[
Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
('have', 'VBP'), ...
]
Tworzenie korpusu tekstu skategoryzowanego
NLTK ma CategorizedPlaintextCorpusReaderklasa, za pomocą której możemy stworzyć skategoryzowany korpus tekstu. Jest to bardzo przydatne w przypadku, gdy mamy duży korpus tekstu i chcemy podzielić go na osobne sekcje.
Na przykład brązowy korpus ma kilka różnych kategorii. Pozwól nam się ich dowiedzieć za pomocą następującego kodu Pythona -
from nltk.corpus import brown^M
brown.categories()
Wynik
[
'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
'reviews', 'romance', 'science_fiction'
]
Jednym z najłatwiejszych sposobów kategoryzowania korpusu jest utworzenie jednego pliku dla każdej kategorii. Na przykład spójrzmy na dwa fragmenty zmovie_reviews korpus -
movie_pos.txt
Cienka czerwona linia jest wadliwa, ale prowokuje.
movie_neg.txt
Wysokobudżetowa i błyszcząca produkcja nie może nadrobić braku spontaniczności, który przenika ich program telewizyjny.
Tak więc z dwóch powyższych plików mamy dwie kategorie, a mianowicie pos i neg.
Teraz stwórzmy instancję CategorizedPlaintextCorpusReader klasa.
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’])
Wynik
['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']