您可能遇到过一些大型教科书,并在结尾处注意到索引。 使用硬拷贝,最好具有这样的索引以快速导航到所需页面。 我最近出版了一本非常短的 ,谈到设置索引,即使这本书很短,任务似乎也很艰巨。 这本书还没有索引。

如果您一直在关注我的文章 ,您会发现我主要写有关Python的文章,以及它如何帮助我们以简单的方式解决不同的问题。 因此,让我们看看如何使用Python设置书籍索引。

事不宜迟,让我们开始吧。

什么是书籍索引?

我是 可以肯定的是,大多数人都知道什么是书本索引,但是我只是想快速澄清一下这个概念。

一个 书籍索引只是被认为对书籍很重要的单词和/或短语及其在书籍中的位置的集合。 索引不包含书中的每个单词/词组。 其原因在下一部分中显示。

什么使好书索引?

如果您有一个索引可以通过它找到书中每个单词或短语的位置怎么办? 那不算是选择的索引吗? 错误!

选择的索引,或被认为是很好的索引,是指向书中重要单词和短语的索引。 您可能会质疑其原因。 让我们举个例子。 假设我们有一本书,仅包含以下句子:

My book is short

如果我们尝试在该非常短的句子中为每个单词和短语建立索引,并且假设该位置是句子中的单词编号,将会发生什么情况? 这是在这种情况下的索引:

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)

在本教程中,我们将使用自然语言工具包(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

您可以通过键入python来测试nltk的安装,然后在终端中导入nltk。 如果出现ImportError: No module named nltk ,则该线程可能会对您有所帮助。

测试文件

这本书:EFF 的变化率变化率 。 您可以从Dropbox下载该书的文本文件。 您当然可以使用自己选择的任何书籍; 您只需要在本教程中进行试验即可。

程序

让我们从本教程中有趣的部分开始,该程序将帮助我们形成书籍索引。 我们要做的第一件事是在书中找到单词频率。 我已经在另一个教程中展示了我们如何做到这一点,但是我想向您展示我们如何使用NLTK库来做到这一点。

可以按以下步骤完成:

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)

当您运行该程序时,您会注意到我们将有很长的单词及其频率列表。

在继续之前,让我们分析一下上面的代码。 在以下行中:

frequencies = collections.Counter()

我们正在尝试使用Counter()函数来获取书中单词的频率(单词在书中出现的次数)。

另一方面, word_tokenize将句子拆分为组成部分。 让我们举一个简单的例子,看看word_tokenize实际如何工作:

from nltk.tokenize import word_tokenize
sentence = 'My name is Abder. I like Python. It\'s a pretty nice programming language'
print (word_tokenize(sentence))

上面脚本的输出如下:

['My', 'name', 'is', 'Abder', '.', 'I', 'like', 'Python', '.', 'It', "'s", 'a', 'pretty', 'nice', 'programming', 'language']

然后,我们遍历单词并找到每个单词出现的频率。
短语(单词组合)呢? 这些被称为并置 (经常一起出现的单词序列)。 搭配的一个例子是bigrams ,这是单词对的列表。 与此类似的是三字母

假设我们要从我们的书中提取二元组。 我们可以这样做,如下所示:

bigram = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(words)
finder.apply_freq_filter(2)

apply_freq_filter( )函数中的数字2告诉我们忽略本书中少于两次出现的所有双apply_freq_filter( )组。

如果要在本书中找到30最常见的二元组,可以使用以下代码语句:

print (finder.nbest(bigram.pmi, 30))

最后,如果我们想找到位置(在本例中单词或词组出现在书本中(而不是页码)),我们可以执行以下操作:

print (read_book.index('computer'))
print (read_book.index('Assisted Reporting'))

上面的语句似乎返回了句子中的单词位置,类似于在本教程开始的短句示例中看到的内容。

放在一起

让我们将学习到的内容放在一个Python脚本中。 以下脚本将阅读我们的书,并返回单词频率以及书中单词和短语的位置以及书中最常见的30个双字母组:

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进行自然语言处理 》一书。