К концу этой статьи вы научитесь получать доступ к различным корпусам из модуля NLTK и сможете выполнять с ними различные операции.

Я также попытаюсь вкратце объяснить WordNet и условное частотное распределение.

Корпус Гутенберга

Модуль NLTK включает в себя около 25 000 бесплатных книг из электронного текстового архива Гутенберга, которые мы можем использовать бесплатно.

Вы можете получить доступ к этому корпусу из модуля nltk.corpus.

from nltk.corpus import gutenberg

Если вы хотите получить доступ к какому-либо тексту, вам нужно будет указать его идентификаторы полей.

Чтобы проверить идентификаторы полей любого текста, вы можете использовать функцию fileids().

>>> gutenberg.fileids()
['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']

В нем перечислены все идентификаторы текста. Если я хочу получить доступ к любому тексту, я могу сделать что-то вроде этого

>>> gutenberg.words("whitman-leaves.txt")
['[', 'Leaves', 'of', 'Grass', 'by', 'Walt', 'Whitman', ...]

Существует 3 способа отображения содержимого любого текста. Они есть:

  • Необработанный

Чтобы отобразить необработанное содержимое текста, мы можем использовать функцию raw(). Внутри скобок мы должны указать текст, к которому мы обращаемся.

>>> gutenberg.raw("whitman-leaves.txt")
'[Leaves of Grass by Walt Whitman 1855]\n\n\nCome, said my soul,\nSuch verses for my Body let us...........

Необработанные данные будут включать все специальные символы, такие как «\n», «\t». Эти символы считаются мусором.

  • Ворд

Подобно необработанной функции, мы можем использовать функцию word() для отображения всех слов из контекста. Слова также считаются токенами.

>>> gutenberg.words("whitman-leaves.txt")
['[', 'Leaves', 'of', 'Grass', 'by', 'Walt', 'Whitman', ...]
  • Предложения

Чтобы разделить текст на основе предложений, мы можем использовать функцию sents().

Где каждое предложение представляет собой список слов.

>>> gutenberg.sents("whitman-leaves.txt")
[['[', 'Leaves', 'of', 'Grass', 'by', 'Walt', 'Whitman', '1855', ']'], ['Come', ',', 'said', 'my', 'soul', ',', 'Such', 'verses', 'for', 'my', 'Body', 'let', 'us', 'write', ',', '(', 'for', 'we', 'are', 'one', ',)', 'That', 'should', 'I', 'after', 'return', ',', 'Or', ',', 'long', ',', 'long', 'hence', ',', 'in', 'other', 'spheres', ',', 'There', 'to', 'some', 'group', 'of', 'mates', 'the', 'chants', 'resuming', ',', '(', 'Tallying', 'Earth', "'", 's', 'soil', ',', 'trees', ',', 'winds', ',', 'tumultuous', 'waves', ',)', 'Ever', 'with', 'pleas', "'", 'd', 'smile', 'I', 'may', 'keep', 'on', ',', 'Ever', 'and', 'ever', 'yet', 'the', 'verses', 'owning', '--', 'as', ',', 'first', ',', 'I', 'here', 'and', 'now', 'Signing', 'for', 'Soul', 'and', 'Body', ',', 'set', 'to', 'them', 'my', 'name', ','], ...]

Чат и веб-текст

Модуль NLTK содержит различные небольшие коллекции веб-текстов, а также тексты чатов, собранные за многие годы.

В случае веб-текста, он включает в себя контент с дискуссионного форума firefox и некоторые другие материалы.

Чтобы получить к нему доступ, вы можете выполнить следующие шаги:

>>> webtext.fileids()
['firefox.txt', 'grail.txt', 'overheard.txt', 'pirates.txt', 'singles.txt', 'wine.txt']

Военно-морская аспирантура собрала сеансы чата для обмена текстовыми сообщениями для исследования по обнаружению интернет-хищников. Они собрали форму корпуса чата, разные возрастные группы.

>>> nps_chat.fileids()
['10-19-20s_706posts.xml', '10-19-30s_705posts.xml', '10-19-40s_686posts.xml', '10-19-adults_706posts.xml', '10-24-40s_706posts.xml', '10-26-teens_706posts.xml'.........]

Формат файлов в формате {дата-возраст группа-сообщения}. Например, файл «10–19–30s_705posts.xml» содержит 705 сообщений, собранных в чате «30s» 19.10.2006.

Корпус на других языках

Модуль NLTK содержит большую коллекцию данных на разных языках. Например, если я хочу получить доступ к хинди-словам из этого модуля, мне придется импортировать «индийский» подмодуль и получить доступ к языку из него.

from nltk.corpus import indian
indian.fileids()

Создание собственного корпуса

Мы можем легко получить доступ к собственному корпусу, указав путь и загрузив их с помощью PlaintextCorpusReader.

>>> from nltk.corpus import PlaintextCorpusReader
>>> directory = "chatbot.txt"
>>> words = PlaintextCorpusReader(directory,".*")
>>> words
<PlaintextCorpusReader in 'C:\\Users\\ADMIN\\chatbot.txt'>

Условное частотное распределение

В предыдущей части я говорил о частотном распределении корпуса с помощью функции FreqDist(). Напомним, частотное распределение — это количество слов, присутствующих в контексте. С другой стороны, условное частотное распределение — это подсчет слов в разных условиях.

Под условиями я подразумеваю разные категории текста. Эти условия могли быть разножанровыми или на какой-то иной основе.

Для этой цели используется функция ConditionalFreqDist(). Эта функция принимает список пар в формате ["условие", "слово"].

Я буду использовать коричневый подмодуль в этом случае, чтобы показать пример.

>>>from nltk.corpus import brown
>>>conditional = ConditionalFreqDist(
             (genre,words)
              for genre in ["science_fiction",'religion']
              for word in brown.words(categories=genre)]
>>>conditional
<ConditionalFreqDist with 2 conditions>

Подобно функции FreqDist(), мы можем использовать функцию most_common() для вывода наиболее часто встречающихся слов.

>>>onditional["religion"].most_common()

Стоп-слова

Есть определенные слова, которые опускаются или отфильтровываются перед обработкой документов. Эти слова известны как стоп-слова. Некоторые из стоп-слов — «а», «к», «есть».

Модуль NLTK состоит из всех стоп-слов для разных языков. Нам просто нужно указать это в скобках.

from nltk.corpus import stopwords
stopwords.words("english")
>>> from nltk.corpus import stopwords
>>> stopwords.words("english")
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself'.......]

Ворднет

WordNet — большая коллекция лексических баз данных для английского языка. Я не смогу объяснить весь модуль wordnet, но расскажу о том, что называется synset.

Каждое слово в английском языке имеет два или более значений. Они сгруппированы вместе и называются набором синонимов или синсетом.

Для этого примера давайте рассмотрим слово плоскость.

>>>from nltk.corpus import wordnet as wn
>>>wn.synsets("plane")
[Synset('airplane.n.01'), Synset('plane.n.02'), Synset('plane.n.03'), Synset('plane.n.04'), Synset('plane.n.05'), Synset('plane.v.01'), Synset('plane.v.02'), Synset('plane.v.03'), Synset('flat.s.01')]

Функция synsets() просто возвращает другой набор синонимов слова «самолет».

>>> wn.synset("airplane.n.01").lemma_names()
['airplane', 'aeroplane', 'plane']
>>> for syn in wn.synsets("plane"):
...     syn.lemma_names()
...
['airplane', 'aeroplane', 'plane']
['plane', 'sheet']
['plane']
['plane', 'planer', 'planing_machine']
['plane', "carpenter's_plane", 'woodworking_plane']
['plane', 'shave']
['plane', 'skim']
['plane']
['flat', 'level', 'plane']

В приведенном выше коде мы можем заметить, что слово «самолет» может иметь разные значения.

Wordnet имеет много других полезных функций, и если вы хотите узнать о нем больше, вам следует ознакомиться с разделом wordnet этой бесплатной книги на nltk https://www.nltk.org/book/ch02.html.

Спасибо, что нашли время прочитать эту статью.

Удачного дня :)