Вы, наверное, сталкивались с некоторыми из этих больших учебников и заметили индекс в конце. С печатной копией хорошо иметь такой индекс для быстрого перехода на нужную страницу. Недавно я опубликовал очень короткую книгу , и когда дело дошло до установки индекса, задача казалась сложной, хотя книга очень короткая. У книги все еще нет индекса.
Если вы следили за моими статьями , вы заметите, что я в основном пишу о Python и о том, как он может помочь нам в решении различных проблем простым способом. Итак, давайте посмотрим, как мы можем установить индекс книги, используя Python.
Без дальнейших церемоний, давайте начнем.
Что такое книжный указатель?
я Я уверен, что большинство из вас знает, что такое книжный указатель, но я просто хочу быстро прояснить эту концепцию.
Книжный указатель — это просто набор слов и / или фраз, которые считаются важными для книги, а также их расположение в книге. Указатель не содержит каждое слово / фразу в книге. Причина этого показана в следующем разделе.
Что делает хороший книжный указатель?
Что если у вас есть указатель, по которому можно найти местоположение каждого слова или фразы в книге? Не будет ли это рассматриваться как показатель выбора? Неправильно!
Индекс выбора, или то, что считается хорошим показателем, — это то, что указывает на важные слова и фразы в книге. Вы можете спросить причину этого. Давайте возьмем пример. Скажем, у нас есть книга, которая состоит только из следующего предложения:
My book is short
Что произойдет, если мы попытаемся проиндексировать каждое слово и фразу в этом очень коротком предложении, предполагая, что местоположение — это номер слова в предложении? Это индекс, который мы имели бы в этом случае:
01
02
03
04
05
06
07
08
09
10
|
my book is short: 1
my book is: 1
my book: 1
my: 1
short: 4
is short: 3
is: 3
book is short: 2
book is: 2
book: 2
|
Из приведенного выше примера мы видим, что такой индекс будет больше, чем сама книга! Таким образом, хорошим указателем будет тот, который содержит слова и фразы, считающиеся важными для читателя.
Настроить
Инструментарий естественного языка (NLTK)
В этом уроке мы будем использовать библиотеку Natural Language Toolkit (NLTK) , которая используется для работы с данными на человеческом языке. Как упоминалось в документации, NLTK был назван «прекрасным инструментом для обучения и работы в области компьютерной лингвистики с использованием Python» и «удивительной библиотекой для игры на естественном языке».
В настоящее время я пишу это руководство с моего компьютера с Ubuntu, и шаги по установке NLTK в этом разделе будут относиться к операционной системе Ubuntu. Но не волнуйтесь, вы можете найти инструкции по установке NLTK в других операционных системах на веб-сайте NLTK .
Для установки NLTK я собираюсь использовать pip . Если у вас еще не установлен pip, вы можете использовать следующую команду в вашем терминале для установки pip
:
sudo easy_install3 pip
Чтобы убедиться, что у вас установлен pip, введите следующую команду:
pip --version
Вы должны получить что-то похожее на следующее:
pip 8.1.2 from /usr/local/lib/python3.5/dist-packages/pip-8.1.2-py3.5.egg (python 3.5)
Теперь, чтобы установить NLTK, просто запустите следующую команду в своем терминале:
sudo pip install -U nltk
Вы можете проверить установку nltk, набрав python
, а затем импортировав nltk в свой терминал. Если вы получите ImportError: No module named nltk
, этот поток может вам помочь.
Тестовый файл
На данный момент нам нужен тестовый файл (книга), чтобы использовать для создания индекса книги. Я возьму эту книгу: Скорость изменения скорости изменения EFF. Вы можете скачать текстовый файл книги из Dropbox . Конечно, вы можете использовать любую книгу по вашему выбору; вам просто нужно поэкспериментировать с этим уроком.
программа
Давайте начнем с интересной части этого урока, программы, которая поможет нам сформировать книжный указатель. Первое, что мы хотим сделать, это найти частоту слова в книге. Я показал, как мы можем это сделать, в другом учебнике , но я хочу показать вам, как мы можем это сделать с помощью библиотеки NLTK.
Это можно сделать следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
|
import nltk, collections
from nltk.collocations import *
frequencies = collections.Counter()
with open(‘bigd10.txt’) as book:
read_book = book.read()
words = nltk.word_tokenize(read_book)
for w in words:
frequencies[w] += 1
print (frequencies)
|
Когда вы запустите программу, вы заметите, что у нас будет очень длинный список слов и их частоты.
Прежде чем двигаться дальше, давайте немного разберем приведенный выше код. В следующей строке:
1
|
frequencies = collections.Counter()
|
Мы пытаемся использовать функцию Counter()
, чтобы получить частоты слов в книге (сколько раз слово встречалось в книге).
word_tokenize
, с другой стороны, разбивает предложения на составные части. Давайте рассмотрим простой пример, чтобы увидеть, как на word_tokenize
деле работает word_tokenize
:
1
2
3
|
from nltk.tokenize import word_tokenize
sentence = ‘My name is Abder.
print (word_tokenize(sentence))
|
Вывод вышеприведенного скрипта выглядит следующим образом:
['My', 'name', 'is', 'Abder', '.', 'I', 'like', 'Python', '.', 'It', "'s", 'a', 'pretty', 'nice', 'programming', 'language']
Затем мы перебираем слова и находим частоту встречаемости каждого слова.
Как насчет фраз (комбинация слов)? Это так называемые словосочетания (последовательность слов, которые часто встречаются вместе). Пример коллокаций — биграммы , то есть список пар слов. Подобно этому триграммы (комбинация из трех слов) и т. Д. (Т. Е. Н-граммы).
Допустим, мы хотим извлечь биграммы из нашей книги. Мы можем сделать это следующим образом:
1
2
3
|
bigram = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(words)
finder.apply_freq_filter(2)
|
Число 2
в функции apply_freq_filter( )
говорит нам игнорировать все биграммы, которые встречаются в книге менее двух раз.
Если мы хотим найти 30
наиболее часто встречающихся биграмм в книге, мы можем использовать следующий код:
1
|
print (finder.nbest(bigram.pmi, 30))
|
Наконец, если мы хотим найти место, где в нашем случае встречается слово или фраза (а не номер страницы), мы можем сделать следующее:
1
2
|
print (read_book.index(‘computer’))
print (read_book.index(‘Assisted Reporting’))
|
Представленные выше утверждения, похоже, возвращают слово location в предложении, аналогично тому, что мы видели в нашем примере с коротким предложением в начале урока.
Собираем все вместе
Давайте поместим то, что мы изучили, в один скрипт Python. Следующий скрипт прочитает нашу книгу и вернет частоты слов вместе с 30 наиболее часто встречающимися биграммами в книге, в дополнение к расположению слова и фразы в книге:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import nltk, collections
from nltk.collocations import *
frequencies = collections.Counter()
with open(‘bigd10.txt’) as book:
read_book = book.read()
words = nltk.word_tokenize(read_book)
for w in words:
frequencies[w] += 1
bigram = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(words)
finder.apply_freq_filter(2)
print (‘Those are the words and their frequency of occurrence in the book:’)
print (frequencies)
print (‘#################################################################’)
print (‘Those are the 30 most bigrams occurring in the book:’)
print (finder.nbest(bigram.pmi, 30))
print (read_book.index(‘computer’))
print (read_book.index(‘Assisted Reporting’))
|
Вывод
Как мы видели в этом руководстве, даже короткий текст может быть очень сложным, когда речь идет о создании индекса для этого текста. Кроме того, автоматизированный способ построения оптимального индекса для книги может оказаться недостаточно осуществимым.
Мы смогли решить эту проблему с помощью Python и библиотеки NLTK, где мы могли выбрать лучшие слова и фразы для индекса книги, основываясь на их частоте появления (т.е. важности) в книге.
Конечно, с NLTK можно сделать еще больше, как показано в документации библиотеки . Вы также можете обратиться к книге « Обработка естественного языка с Python», если хотите углубиться в эту библиотеку.