本系列为学习《python 自然语言处理》这本书的笔记,其目的是便于以后查阅方便。
Chapter 1 语言处理与python
用的自然语言工具包是nltk,语言处理任务与相应NLTK模块以及功能描述如下:
语言处理任务 | NLTK模块 | 功能描述 |
---|---|---|
获取语料库 | nltk.corpus | 语料库和词典的标准化接口 |
字符串处理 | nltk.tokenize,nltk.stem | 分词、句子分解、提取主干 |
搭配研究 | nltk.collocations | t-检验,卡方,点互信息PMI |
词性标示符 | nltk.tag | n-gram,backoff,Brill,HMM,TnT |
分类 | nltk.classify,nltk.cluster | 决策树,最大熵,朴素贝叶斯,EM,k-means |
分块 | nltk.chunk | 正则表达式,n-gram,命名实体 |
解析 | nltk.parse | 图标,基于特征,一致性,概率性,依赖项 |
语义解释 | nltk.sem,nltk.inference | λ演算,一阶逻辑,模型检验 |
指标评测 | nltk.metrics | 精度,召回率,协议系数 |
概率与估计 | nltk.probability | 频率分布,平滑概率分布 |
应用 | nltk.app,nltk.chat | 图形化的关键词排序,分析器,WordNet查看器,聊天机器人 |
语言学领域的工作 | nltk.toolbox | 处理SIL工具箱格式的数据 |
# NLTK入门
import nltk
nltk.download()
# 选择all,下载所有的资料
from nltk.book import *
## 1.1 搜索文本
text1.concordance("monstrous")
text1.similar("monstrous") # 搜索相似词
text2.common_contexts(["monstrous","very"]) # 两个或两个以上的词共同的上下文
text4.dispersion_plot(["citizens", "democracy", "freedom", "duties", "America"]) # 获取词汇分布图
len(text3) # text3的词汇数
sorted(set(text3)) # text3去重后排序输出
len(set(text3)) #text3不重复的词汇数
text3.count("smote") # 统计某个词出现的次数
100*text4.count('a')/len(text4) # 计算一个特定词在文本中占据的百分比
def lexical_diversity(text):
return len(text)/len(set(text))
def percentage(count,total):
return 100*count/total
## 1.2 将文本当做词列表
sent1
text4.index('awaken')
## 1.3 简单的统计
fdist1 = FreqDist(text1)
vocabulary1 = list(fdist1.keys()) # 得到频数的key值
vocabulary1[:50]
fdist1['whom'] # 得到某个单词出现的频数
fdist1.plot(50, cumulative=True) # 画出前50个词出现的频数图
fdist1.hapaxes() # 获取文本中出现一次的词(低频词)
## 1.4 细粒度的选择词
"文本中的长词,即词汇表长度超过15个字符的词。"
V = set(text1) # 获取text4中不重复的词
long_words = [w for w in V if len(w) > 15] # 获取单词长度大于15个字母的词语
sorted(long_words) # 顺序输出这些单词
fdist5 = FreqDist(text5) # 获取text5的词频分布
sorted([w for w in set(text5) if len(w) > 7 and fdist5[w] > 7]) # 顺序输出单词长度大于7且出现次数大于7的单词
## 1.5 词语搭配和双连词(bigrams)
from nltk.util import bigrams # 使用bigrams获取句子中双联词的搭配
list(bigrams(['more', 'is', 'said', 'than', 'done']))
text4.collocations() # 使用collocations()函数找出常用的双联词
fdist = FreqDist([len(w) for w in text1]) # 计算不同长度的单词出现的频率分布
fdist.items()
fdist.max()
fdist.freq(3) # 打印出3出现的频率
NLTK频率分布类中定义的函数:
fdist= FreqDist(samples) :创建包含给定样本的频率分布
fdist.inc(sample): 增加样本
fdist['monstrous']: 计数给定样本出现的次数
fdist.freq('monstrous') :给定样本的频率
fdist.N() :样本总数
fdist.keys() :以频率递减顺序排序的样本链表
forsample in fdist:以频率递减的顺序遍历样本
fdist.max() :数值最大的样本
fdist.tabulate() :绘制频率分布表
fdist.plot() :绘制频率分布图
fdist.plot(cumulative=True) :绘制累积频率分布图
fdist1< fdist2 :测试样本在 fdist1中出现的频率是否小于 fdist2
一些词比较运算符:
s.startswith(t) :测试 s是否以t开头
s.endswith(t): 测试 s是否以t结尾
tin s :测试 s是否包含t
s.islower() :测试 s中所有字符是否都是小写字母
s.isupper() :测试 s中所有字符是否都是大写字母
s.isalpha(): 测试 s中所有字符是否都是字母
s.isalnum() :测试 s中所有字符是否都是字母或数字
s.isdigit() :测试 s中所有字符是否都是数字
s.istitle() :测试 s是否首字母大写( s中所有的词都首字母大写)