Статьи

Подготовка индекса книги с использованием Python

Вы, наверное, сталкивались с некоторыми из этих больших учебников и заметили индекс в конце. С печатной копией хорошо иметь такой индекс для быстрого перехода на нужную страницу. Недавно я опубликовал очень короткую книгу , и когда дело дошло до установки индекса, задача казалась сложной, хотя книга очень короткая. У книги все еще нет индекса.

Если вы следили за моими статьями , вы заметите, что я в основном пишу о 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

Из приведенного выше примера мы видим, что такой индекс будет больше, чем сама книга! Таким образом, хорошим указателем будет тот, который содержит слова и фразы, считающиеся важными для читателя.

В этом уроке мы будем использовать библиотеку 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», если хотите углубиться в эту библиотеку.