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