1.1语言计算:文本和词汇
NLTK入门
第一步是在python提示符后输入一个特殊的命令,告诉解释器去加载一些我们要用的文本:
from nltk.book import* # 以下所有操作均在此操作下进行
找到文本
print(text1) #这里只能看到该文件的标题
print(text2)
print(text3)
print(text4)
...
搜索文本
#.concordance() 找特定词以及上下文
#搜索text1文本中monstrous出现的情况,包括它的上下文
print(text1.concordance('monstrous')
```python
#.similar()与指定词在上下文中使用相似的其他词(判断该词的特性)
print(text1.similar('monstrous')
```python
#.common_contexts([])研究共用两个或两个以上词汇的上下文,如monstrous和very
print(text2.common_contents(['monstrous','very']))
```python
#.dispersion_plot 判断词在文本中的位置:从文本开头起有多少词出现。可以用离散图表示该位置信息。
print(text4.dispersion_plot(['citizens','democracy','freemdom','duties','Ameriica']))
#.generate()随机生成一些随机文本,每次运行,输出的文本都会不同,但它重复使用了源文件中常见的单词和短语。(但不知道为什么,我这边一直显示的是同一个文本,如果有哪位大神知道原因,请告知我一下,在此谢过。)
print(text3.generate()) #注意,括号里什么也没有
计数词汇
#len()
#计算该文本的长度
print(len(text3))
#查找文本中有多少不同的单词
#首先去重,获得的都是不同的标识符的一个**集合**
res = set(text3)
#其次进行排序,标点在最开始,其次是A开头的词汇,大写单词排在小写单词前面。
print(sorted(res))
#计算去重后的文本单词数,也就说明该本书由这些词组成
print(len(set(text3)))
#那么每个词平均使用的次数
print(len(text3)/len(set(text3)))
#计数一个单词在文本中出现的次数以及占该文本的百分比
print(text3.count('smote'))
print(100*text4.count('a')/len(text4))
#这里提一个小问题,如何将text3中的单词去重,计算每个词的词频
from nltk.book import*
a = set(text3)
b = sorted(a)
for i in b:
print(i)
res = text3.count(i)
print(res)
#函数:重复使用
def lexical_diversity(text):
return len(text)/len(set(text))
a = lexical_diversity(text3)
print(a)
def percentage(count,total):
return 100*count/total
a = percentage(4,5)
print(a)
1.2将文本当做词链表
#两个链表相加
#1:
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
print(sent1+sent2)
#扩充1
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
sent1.extend(sent2)
print(sent1)
sent2.extend(sent1)
print(sent2)
#扩充2
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
for item in sent2:
sent1.append(item)
print(sent1)
#追加
sent1.append('some')
print(sent1)
索引列表
#索引,索引从0开始
a = text4[173] #该位置的单词
b = text4.index('awaken') #该词的索引号
print(a,b)
#切片 (顾头不顾尾)
res = text5[16715:16735]
print(res)
res1 = text5[:3] #0-2
res2 = text5[3:] # 3-end
变量
变量 = 表达式
变量必须以字母开头,可以包含数字和下划线。
变量常用来保存计算的中间步骤
vocab = set(text1)
vocal_size = len(vocab)
print(vocab_size)
字符串
一些用来访问链表(列表)元素的方法也可以用在单独的词或字符串上。
neme = 'Monty'
print(name[0])
print(name[:4]
还可以对字符串执行乘法和加法
用词把链表连接起来组成单个字符串,或者把字符串分割成一个链表
res1 = ' '.join(['Monty','Python']) #''.join()将单个字符串以‘’内的内容分隔相连
print(res1)
res2 = res1.split()
print(res2)
1.3简单的统计
复习上节使用内容
saying = ['After','all','is','said','and','done','more','is','said','than','done']
tokens = set(saying)
tokens = sorted(tokens)
print(tokens[-2:])
在输入后请思考一下,最后的答案与自己思考的是否一致,如若一致,则恭喜你,上一节的内容已经掌握的很好了
频率分布
#FreqDist()函数:获取在文本中每个出现的标识符的频率分布。通常情况下,函数得到的是每个标识符出现的次数与标识符的map映射。
from nltk.book import*
fdist = FreqDist(text1)
vocabulary = list(fdist.keys())
print(vocabulary[:50]) #寻找text1中最常见的50个词
print(fdist['whale']) #'whale'这个单词出现的频率
fdiist.plot(50,cumulative = True) #text1中最常用词的累积频率图
#其中,累积频率,就是按某种标志对数据进行分组后,分布在各组内的数据个数称为频数或次数,各组频数与全部频数之和的比值称为频率或比重。
print(fdist)
print(fdist.hapaxes()) #
查找只出现过一次的词
细粒度的选择词
查看文本中的长词。例如,如果想要找出文本词汇表中长度超过15个字符的词,则把它们称为特性P,则当且仅当词w的长度大于15个字符时P(w)为真。现在a中的数学几何符号表示我们感兴趣的词汇。b的含义是:此集合中所有w都满足:w是集合V(词汇表)的一个元素且w有特性p。 b . [w for w in V if p(w)]
V = set(text1)
long_words = [ w for w in V if len(w) >15 ]
sorted(long_words)
print(long_words)
那么如何特征词呢?我们可以寻找一些出现频率高的长词,这样就忽略了短高频词(如the)和长低频词。
fdist = FreqDist(text5)
print(sorted([ w for w in set(text5) if len(w) > 7 and fdist[w] > 7])
#len(w) > 7 长度大于7,fdist[w] > 7 出现次数大于7
词语搭配和双连词
搭配是不经常在一起出现的词序列,其特点是其中的词不能被类似的词置换。要想获取搭配,首先从提取文本词汇中的词对开始(也就是双连词)
#bigrams() 获得词对
print(bigrams(['more','is','said','than','done']))
#会报错,bigrams函数返回了一个“ generator”对象。 这是一种Python数据类型,类似于List,但仅在需要时创建其元素。 如果要将生成器生成列表,则需要将其形式转换为列表。因此,要改写成
print(list(bigrams(['more','is','said','than','done'])))
#collocations()函数,在已知单个词汇频率的基础上,找到出现频率比与预期频率更频繁的双连词。(也就是说找频率高的双连词)
print(text4.collocations())
print(text8.collocations())
计算其他东西
查看文本中词长的分布
print([len(w) for w in text1])
fdist = FreqDist([len(w) for w in text1])
print(fdist)
print(fdist.keys())
不同长度的词的频率是多少呢?
print(fdist.items()) #计算频率
print(fdist.max()) #查找最频繁词
print(fdist[3]) #最频繁词的个数
print(fdist.freq(3)) #最频次占全部词汇的比重