Считыватели корпусов и пользовательские корпуса

Что такое корпус?

Корпус - это большая коллекция в структурированном формате машиночитаемых текстов, которые были созданы в естественной коммуникативной среде. Слово «корпус» является множественным числом от «Корпус». Корпус может быть получен разными способами следующим образом:

  • Из текста, который изначально был электронным
  • Из стенограмм разговорной речи
  • От оптического распознавания символов и т. Д.

Репрезентативность корпуса, баланс корпуса, выборка, размер корпуса - это элементы, которые играют важную роль при разработке корпуса. Некоторые из самых популярных корпусов для задач НЛП - 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']