Считыватели корпусов и пользовательские корпуса
Что такое корпус?
Корпус - это большая коллекция в структурированном формате машиночитаемых текстов, которые были созданы в естественной коммуникативной среде. Слово «корпус» является множественным числом от «Корпус». Корпус может быть получен разными способами следующим образом:
- Из текста, который изначально был электронным
- Из стенограмм разговорной речи
- От оптического распознавания символов и т. Д.
Репрезентативность корпуса, баланс корпуса, выборка, размер корпуса - это элементы, которые играют важную роль при разработке корпуса. Некоторые из самых популярных корпусов для задач НЛП - TreeBank, PropBank, VarbNet и WordNet.
Как создать собственный корпус?
При загрузке NLTK мы также установили пакет данных NLTK. Итак, на нашем компьютере уже установлен пакет данных NLTK. Если говорить о Windows, мы предполагаем, что этот пакет данных установлен вC:\natural_language_toolkit_data и если мы говорим о Linux, Unix и Mac OS X, мы будем предполагать, что этот пакет данных установлен в /usr/share/natural_language_toolkit_data.
В следующем рецепте Python мы собираемся создать настраиваемые корпуса, которые должны находиться в пределах одного из путей, определенных NLTK. Потому что его может найти НЛТК. Чтобы избежать конфликта с официальным пакетом данных NLTK, давайте создадим собственный каталог natural_language_toolkit_data в нашем домашнем каталоге.
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)
Вывод
True
Теперь давайте проверим, есть ли у нас каталог natural_language_toolkit_data в нашем домашнем каталоге или нет -
import nltk.data
path in nltk.data.path
Вывод
True
Поскольку мы получили результат True, это означает, что у нас есть nltk_data каталог в нашем домашнем каталоге.
Теперь мы создадим файл списка слов с именем wordfile.txt и поместите его в папку с именем corpus в nltk_data каталог (~/nltk_data/corpus/wordfile.txt) и загрузит его, используя nltk.data.load -
import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)
Вывод
b’tutorialspoint\n’
Читатели корпуса
NLTK предоставляет различные классы CorpusReader. Мы собираемся рассказать о них в следующих рецептах Python
Создание корпуса словаря
НЛТК имеет WordListCorpusReaderкласс, обеспечивающий доступ к файлу, содержащему список слов. Для следующего рецепта Python нам нужно создать файл списка слов, который может быть CSV или обычным текстовым файлом. Например, мы создали файл с именем «список», который содержит следующие данные:
tutorialspoint
Online
Free
Tutorials
Теперь давайте создадим экземпляр WordListCorpusReader класс, производящий список слов из нашего созданного файла ‘list’.
from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()
Вывод
['tutorialspoint', 'Online', 'Free', 'Tutorials']
Создание корпуса слов с тегами POS
НЛТК имеет TaggedCorpusReaderкласс, с помощью которого мы можем создать корпус слов с тегами POS. Фактически, POS-теги - это процесс идентификации тега части речи для слова.
Один из простейших форматов помеченного корпуса - это форма «слово / тег», как в следующем отрывке из коричневого корпуса:
The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.
В приведенном выше отрывке каждое слово имеет тег, обозначающий его POS. Например,vb относится к глаголу.
Теперь давайте создадим экземпляр TaggedCorpusReaderкласс, создающий слова с тегами POS из файла ‘list.pos’, в котором есть приведенный выше отрывок.
from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()
Вывод
[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]
Создание корпуса фрагментированных фраз
НЛТК имеет ChnkedCorpusReaderкласс, с помощью которого мы можем создать корпус Chunked фраз. На самом деле кусок - это короткая фраза в предложении.
Например, у нас есть следующий отрывок из помеченного treebank корпус -
[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.
В приведенном выше отрывке каждый фрагмент - это именная фраза, но слова, не заключенные в скобки, являются частью дерева предложений, а не частью какого-либо поддерева именной фразы.
Теперь давайте создадим экземпляр ChunkedCorpusReader класс, производящий фрагментированную фразу из файла ‘list.chunk’, в котором есть приведенный выше отрывок.
from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()
Вывод
[
Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
('have', 'VBP'), ...
]
Создание тематического корпуса текста
НЛТК имеет CategorizedPlaintextCorpusReaderкласс, с помощью которого мы можем создать корпус текста по категориям. Это очень полезно в случае, когда у нас есть большой корпус текста и мы хотим разделить его на отдельные разделы.
Например, коричневый корпус имеет несколько разных категорий. Давайте узнаем их с помощью следующего кода Python -
from nltk.corpus import brown^M
brown.categories()
Вывод
[
'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
'reviews', 'romance', 'science_fiction'
]
Один из самых простых способов разбить корпус на категории - создать по одному файлу для каждой категории. Например, давайте посмотрим два отрывка изmovie_reviews корпус -
movie_pos.txt
Тонкая красная линия ошибочна, но провоцирует.
movie_neg.txt
Крупнобюджетная и глянцевая постановка не может компенсировать отсутствие спонтанности, которой пронизано их телешоу.
Итак, из двух файлов выше у нас есть две категории, а именно pos и neg.
Теперь давайте создадим экземпляр CategorizedPlaintextCorpusReader класс.
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’])
Вывод
['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']