前言

1.1 语言计算:文本及词汇

NLTK入门

1
2
3
# 导入及浏览下载软件包
import nltk
nltk.download()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from nltk.book import *
"""
*** Introductory Examples for the NLTK Book ***
Loading text1, ..., text9 and sent1, ..., sent9
Type the name of the text or sentence to view it.
Type: 'texts()' or 'sents()' to list the materials.
text1: Moby Dick by Herman Melville 1851
text2: Sense and Sensibility by Jane Austen 1811
text3: The Book of Genesis
text4: Inaugural Address Corpus
text5: Chat Corpus
text6: Monty Python and the Holy Grail
text7: Wall Street Journal
text8: Personals Corpus
text9: The Man Who Was Thursday by G . K . Chesterton 1908
"""
1
2
3
4
5
6
7
8
9
文本1:《白鲸记》-赫尔曼·梅尔维尔,1851年
文本2:《感觉与情感》-简·奥斯汀,1811年
文本3:创世纪之书
文本4:就职演说语料库
文本5:聊天语料库
文本6:巨蟒和圣杯
文本7:华尔街日报
文本8:个人语料库
文本9:《代号星期四》-切斯特顿,1908年

搜索文本

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找《白鲸记》中的词monstrous
text1.concordance("monstrous")
# 查找出现在相似上下文中的词
text1.similar("monstrous")
# 研究共用两个或两个以上词汇的上下文
text1.common_contexts(["monstrous","very"])

# 画分布图需要引用 numpy 和 matplotlib
# 离散图表示从文本开头算起有多少词出现的位置信息
text4.dispersion_plot(["citizens","democracy","freedom","duties","America"])

# 产生相似风格的随机文本,标点符号和单词分开
text3.generate()

计数词汇

1
2
3
4
5
# 列表操作(计算长度,排序,去重,追加)
len(text3)
sorted(set(text3)) # 大写字母出现在小写字母之前
len(set(text3))
text3.count("smote")

1.2 近观Python:将文本当做词链表

1
2
3
4
5
text3+text4
sent1.append("Some")
# 索引列表,索引从0开始
text4[173]
text4.index('awaken')

1.3 计算语言:简单的统计

频率分布

1
2
3
4
5
6
7
8
9
10
fdist1=FreqDist(text1)
"""
>>> fdist1
FreqDist({',': 18713, 'the': 13721, '.': 6862, 'of': 6536, 'and': 6024, 'a': 456
9, 'to': 4542, ';': 4072, 'in': 3916, 'that': 2982, ...})
"""
fdist1.plot(50,cumulative=True) # 前50个词的积累频率图
vocabulary1=list(fdist1.keys()) # 字典键值变列表
vocabulary1[:50] # 切片
fdist1.hapaxes() # 只出现1词的词

细粒度的选择词

链表推导条件式

1
2
3
4
5
V = set(text1)
long_words = [w for w in V if len(w)>15]

fdist5=FreqDist(text5)
sorted([w for w in set(text5) if len(w)>7 and fdist5[w]>7])

词语搭配和双连词

搭配是不经常在一起出现的词序列

1
2
3
4
5
6
7
8
# 获取词对
bigrams(['more','is','said','than','done','!'])
"""
>>> list(bigrams(['more','is','said','than','done','!']))
[('more', 'is'), ('is', 'said'), ('said', 'than'), ('than', 'done'), ('done', '!')]
"""
# 找到出现频率比预期频率更频繁的双联词
text4.collocations()

计算其他东西

除了计算词汇外,还可以计算词长等

表1-2 NLTK频率分布类中定义的函数

例子 描述
fdist = FreqDist(text1) 创建包含给定样本的分布
fdist.inc(text1) 增加样本
fdist[‘monstrous’] 计数给定样本出现的次数
fdist.freq(‘monstrous’) 给定样本的频率
fdist.N 样本总数
fdisk.keys() 以频率递减顺序排序的样本链表
for sample in fdist: 以频率递减的顺序遍历样本
fdist.max() 数值最大的样本
fdist.tabulate() 绘制频率分布表
fdist.plot() 绘制频率分布图
fdist.plot(cumulative=True) 绘制积累频率分布图
fdist1<fdist2 测试样本在fdist1中出现的频率是否小于fdist2

1.4 回到Python:决策与控制

表1-3 数值比较运算符(略)

表1-4 词汇比较运算符
|函数|含义|
|:-|:-|
|s.startswith(t) |测试s是否以t开头
|s.endswith(t) |测试s是否以t结尾
|t in s |测试s是否包含t
|s.islower() |测试s中所有字符是否都是小写字母
|s.isupper() |测试s中所有字符是否都是大写字母
|s.isalpha() |测试s中所有字符是否都是字母
|s.isalnum() |测试s中所有字符是否都是字母或数字
|s.isdigit() |测试s中所有字符是否都是数字
|s.istitle() |测试s是否首字母大写(s中的所有词都首字母大写)

对每个元素进行操作

处理

  • 链表推导

    • [f(w) for ...]
    • [w.f() for ...]
  • 过滤字母,不区分大小写

    • set([w.lower() for w in text1 if w.isalpha()])

      嵌套代码块(略)

      条件循环(略)

1.5 自动理解自然语言

词义消歧

要分析出特定上下文中的词被赋予的是哪个意思

指代消解(anaphora resolution):

处理这个问题的计算技术包括:

  • 确定代词或名词指的是什么
  • 语义角色标注(semantic role labeling):确定名词短语如何与动词相关联(如代理、受事、工具等)

自动生成语言

机器翻译

1
babelize_shell()

文本对齐:自动配对组成句子的过程

人机对话系统

1
nltk.chat.chatbots()

文本的含义

文本含义识别(Recognizing Textual Entailment,RTE)

最后更新: 2019年05月09日 12:35

原始链接: https://ice-melt.github.io/2019/04/10/Python_NLP_01/

× 您的支持是我原创的动力
打赏二维码