К концу этой статьи вы научитесь получать доступ к различным корпусам из модуля 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.
Спасибо, что нашли время прочитать эту статью.
Удачного дня :)