第一章 语言处理与Python
1 NLTK入门安装好Python之后,可以使用"pip install nltk"安装NLTK,安装完NLTK后,启动Python解释器,在Python提示符后面输入下面两个命令安装所需的数据及包。import nltknltk.do
1 NLTK入门
安装好Python之后,可以使用"pip install nltk"安装NLTK,安装完NLTK后,启动Python解释器,在Python提示符后面输入下面两个命令安装所需的数据及包。
import nltk
nltk.download()
弹出NLTK下载器,如下图1.1所示。
图1.1 NLTK Downloader
选择Download Directory,然后点击all,再点击Download,即可下载所有的数据包。下载完成后即可通过python语句加载使用NLTK数据包,如图1.2所示。
图1.2 加载NLTK数据包
2 搜索文本
除了阅读文本之外, 还有很多方法可以用来研究文本内容。 词语索引视图显示一个指定单词的每一次出现,连同一些上下文一起显示。下面我们输入 text1后面跟一个点,再输入函数名字concordance,然后将待查的词的名monstrous放在括号里,来查一下《白鲸记》中的词monstrous,如图2.1所示。
图2.1 搜索词monstrous
词语索引使我们看到词的上下文,通过similar函数还可以查看哪些词出现在相似的上下文中,如图2.2所示。
图2.2 查看出现在相似上下文的词
函数common_contexts允许我们研究两个或两个以上的词共同的上下文,如monstrous和very。我们必须用方括号和圆括号把这些词括起来,中间用逗号分割,如图2.3所示。
图2.3 函数common_contexts研究两个或两个以上的词共同的上下文
自动检测出现在文本中的特定的词, 并显示同样上下文中出现的一些词, 这只是一个方面。 我们也可以判断词在文本中的位置: 从文本开头算起在它前面有多少词。 这个位置信息可以用离散图表示。通过dispersion_plot函数可以画出词的离散图,每一个竖线代表一个单词,每一行代表整个文本,如下图2.4。
text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"])
图2.4 美国总统就职演说词汇分布图:可以用来研究随时间推移语言使用上的变化
3 计数词汇
首先,让我们以文本中出现的词和标点符号为单位算出文本从头到尾的长度。我们使用函数len获取长度,请看在《创世纪》中使用的例子,这表明《创世纪》有 44764个词和标点符号或者叫“ 标识符”,如图3.1所示。
图3.1 len获取长度
为了统计《创世纪》中有多少个不同的词,我们使用set(text3)获得text3的词汇表,对词汇表进行排序得到排序表,并统计不同词的个数,如图3.2,3.3所示。
图3.2 使用set(text3)获得text3的词汇排序表
图3.3 统计text3不同词的个数
现在我们对文本词汇丰富度进行测量,即计算每个字平均被使用的次数,如图3.4所示。
图3.4 测量文本词汇丰富度
接下来, 让我们专注于特定的词。 计数一个词在文本中出现的次数, 计算一个特定的词在文本中占据的百分比,如图3.5所示。
图3.5 计算一个特定的词在文本中占据的百分比
你也许想要对几个文本重复这些计算, 但重新输入公式是乏味的。你可以自己命名一个任务,如“ lexical_diversity” 或“ percentage”,然后用一个代码块关联它。现在,你只需输入一个很短的名字就可以代替一行或多行 Python代码,而且你想用多少次就用多少次。执行一个任务的代码段叫做一个函数。
# 计算某个词在文本中出现的次数
def lexical_diversity(text):
return len(text) / len(set(text))
# 计算某个词在文本中占据的百分比
def percentage(count, total):
return 100 * count / total
只要 Python知道了 lexical_diversity()和 percentage()是指定代码段的名字,我们就可以继续使用这些函数。
lexical_diversity(text3)
lexical_diversity(text5)
percentage(4, 5)
percentage(text4.count('a'), len(text4))
4 频率分布
频率分布告诉我们文本中词标识符的总数是如何分布在词项中的。 因为我们经常需要在语言处理中使用频率分布, 在NLTK中有内置函数FreqDist,让我们使用FreqDist寻找《白鲸记》中最常见的 50个词,如图4.1所示。
fdist1 = FreqDist(text1)
vocabulary1 = fdist1.keys()
[vocabulary1][:50]
图4.1 寻找《白鲸记》中最常见的50个词
累积频率有助于我们了解这些词在文中所占的比例,计算并绘出《白鲸记》中50个最常用词的累积频率图,如图4.2所示。
fdist1.plot(50,cumulative=True)
图4.2 《白鲸记》中50个最常用词的累积频率图
5 细粒度地选择词
接下来,让我们看看文本中的长词,也许它们有更多的特征和信息量。找出文本词汇表长度中超过 15个字符的词,如图5.1所示。
V = set(text1)
long_words = [w for w in V if len(w) > 15]
sorted(long_words)
图5.1 找出文本词汇表长度中超过 15个字符的词
为了寻找文本特征词汇,考虑到也许找长词出现的频率会更好。这样忽略了短高频词(如the)和长低频词(如antiphilosophists),以下是聊天语料库中所有长度超过7个字符出现次数超过7次的词,如图5.2所示。
fdist5 = FreqDist(text5)
sorted([w for w in set(text5) if len(w) > 7 and fdist5[w] > 7])
图5.2 聊天语料库中所有长度超过7个字符出现次数超过7次的词
6 词语搭配和双连词
一个搭配是异乎寻常的经常在一起出现的词序列。要获取搭配,我们先从提取文本词汇中的词对也就是双连词开始。使用函数bigrams()很容易实现,如下图6.1所示。
from nltk import *
list(bigrams(['more','is','said','than','done']))
图6.1 bigrams()实现双连词的提取
collocations()函数为我们找到比我们基于单个词的频率预期得到的更频繁出现的双连词,如图6.2所示。
from nltk.book import *
text4.collocations()
text8.collocations()
图6.2 collocations()函数
7 计数其他东西
计数词汇是有用的,我们也可以计数其他东西。例如,我们可以查看文本中词长的分布,通过创造一长串数字的链表的FreqDist,其中每个数字是文本中对应词的长度,如图7.1,7.2所示。
from nltk.book import *
[len(w) for w in text1]
fdist = FreqDist([len(w) for w in text1])
fdist.keys()
图7.1 查看文本中每个词的长度
图7.2 查看文本中词长分布
下面通过freq()函数计算不同长度的词的频率,如图7.3所示。
from nltk.book import *
fdist = FreqDist([len(w) for w in text1])
fdist.items()
fdist.max()
fdist.max()
图7.3 计算不同长度的词的频率
由此我们看到, 最频繁的词长度是 3, 长度为 3的词有 50,000多个( 约占书中全部词汇的20%)。虽然我们不会在这里追究它,关于词长的进一步分析可能帮助我们了解作者、文体或语言之间的差异。如下图7.4总结了NLTK频率分布类中定义的函数。
图7.4 NLTK频率分布类中定义的函数
*【注】如果你觉得此文不错,可以考虑打赏我哦,您的打赏将是我更新的最大动力,非常感谢。(打赏也是基于自愿原则的哦( ̄︶ ̄))
更多推荐
所有评论(0)