Lesson 5

v1.0.0, 2016.12 by David Yi
v1.0.1, 2017.02 modified by Yimeng Zhang
v1.1, 2020.4 edit by David Yi

本次内容要点

  • 字典dict 用法
  • 元组tuple 用法
  • 思考:中文分词

字典dict 用法

字典是另一种可变容器模型,可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如 d = {key1 : value1, key2 : value2 }

字典中的 key 值不可以重复(第一次定义后不能重复定义)。

字典的几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而 list 相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

字典的基本操作:

  • 创建字典
  • 访问字典中的 key-value
  • 修改字典中的 key-value
  • 获得字典中指定 key 的 value
  • 删除字典中的 key(value 也就消失了)

In [2]:
# 定义字典
# 访问字典中的 key-value

d = {'Tom': 95, 'Mary': 90, 'Tracy': 92}
print(d)
print(d['Tom'])


{'Tom': 95, 'Mary': 90, 'Tracy': 92}
95

In [3]:
# 字典增加元素,直接定义值即可

d['Hugo'] = 85
print(d)


{'Tom': 95, 'Mary': 90, 'Tracy': 92, 'Hugo': 85}

In [4]:
# 修改字典元素的值

d['Tom'] = 97
print(d)

# 字典是否存在某个 key
print('Tom' in d)

# 如果要获得不存在的 key 的 value,可以设置默认值
print(d.get('Tommy',80))


{'Tom': 97, 'Mary': 90, 'Tracy': 92, 'Hugo': 85}
True
80

In [5]:
# 去获得不存在的 key 的 value,会报错
print(d['Tommy'])


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-5-fc52250d48ea> in <module>
      1 # 去获得不存在的 key 的 value,会报错
----> 2 print(d['Tommy'])

KeyError: 'Tommy'

In [ ]:
# 字典删除 key

d = {'Tom': 95, 'Mary': 90, 'Tracy': 92}
print(d)

# 删除 key
d.pop('Tom')
print(d)

In [ ]:
# 获得字典的长度

# 定义一个空的字典
d = {}

# 造一些字典内容
# str 函数将整数转换为字符串
for i in range(30):
    d['id_'+str(i)] = i*3
print(d)

print(len(d))

元组Tuple 用法

Tuple 也是一种有序列表,在存储数据方面和列表很相似,为了区分,我们叫它元组。 Tuple 一旦内容存储后,就不能修改;这样的好处是数据很安全。

应用范围:在我们需要使用列表功能的时候,但是又不需要改变这个列表的内容,用元组 Tuple 功能会很安全,不用担心程序中不小心修改了其内容。Python 在向函数传递多个参数的时候,就是采用元组,保证参数在被调用的过程中的安全。


In [ ]:
# 创建元组,用小括号

t = ('Tom', 'Jerry', 'Mary')
print(t)

In [ ]:
# 访问元组的元素

print(t[1])

In [ ]:
# 元组创建后是不能修改的

# 会报错
t.append('Someone')

In [ ]:
# 元组创建后是不能修改的

# 像列表一样去定义值也会报错
# 'tuple' object does not support item assignment
t[1] = 'aaa'

In [ ]:
# 看看 tuple 有什么方法,你会发现很少

print(dir(tuple))

In [ ]:
# 创建复杂一点的元组

t1  = ['A', 'B', 'C']
t2 =(t1, 100, 200)
print(t2)

In [ ]:
# 变通的实现"可变"元组内容

t1  = ['A', 'B', 'C']
t2 =(t1, 100, 200)
print(t1)
print(t2)

# tuple的每个元素,指向永远不变,但指向的元素本身是可变的
t1.append('D')

print(t1)
print(t2)

In [ ]:
# 创建只有1个元素的元组

# 下面这样是不行的
t = (1)
# l成了一个整数,因为这里的括号有歧义,被认作数学计算里的小括号
print(type(t))  

# 1个元素的元组必须加逗号来消除歧义
t = (1,)
print(type(t))
print(t)

思考

  • 中文分词,是一个很有趣的话题,也是机器学习中关于语言处理的最基本的概念。今天我们看看 Python 怎么处理中文分词;
  • 需要先安装 jieba 这个 Python 的库,使用 pip install jieba;
  • 在 notebook 中执行命令可以在命令前面价格 !来进行;
  • 导入 jieba 之后,第一次运行会有一个初始化过程,稍稍产生一些影响。

In [ ]:
!pip install jieba

In [ ]:
import jieba

# 全模式
# 把句子中所有的可以称此的词语都扫描出来,速度非常快,但是不能解决歧义

seg_list = jieba.cut("今天上海的天气怎么样", cut_all = True)
print("Full Mode: " + "/ ".join(seg_list))

In [ ]:
# 精确模式
# 试图将句子最精确的切开,适合文本分析

seg_list = jieba.cut("明天纽约下雨么", cut_all = False)
print("Default Mode: " + "/ ".join(seg_list))

In [ ]:
# 默认是精确模式

seg_list = jieba.cut("现在天气怎么样")  
print(", ".join(seg_list))

In [ ]:
# 默认是精确模式

seg_list = jieba.cut("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  
print(", ".join(seg_list))

In [ ]:
# 搜索引擎模式
# 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词    

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") 
print(", ".join(seg_list))

In [ ]:
# 看看网络上的段子,分词带来的烦恼

seg_list = jieba.cut_for_search("黑夜总会过去") 
print(", ".join(seg_list))
seg_list = jieba.cut("黑夜总会过去", cut_all = True)
print(", ".join(seg_list))

In [ ]:
# 默认是精确模式
seg_list = jieba.cut("2016年第一季度支付事业部交易量报表")  
print(','.join(seg_list))

In [ ]:
# 默认是精确模式
seg_list = jieba.cut("2016年第一季度支付事业部交易量报表")  
for i in seg_list:
    print(i)

In [ ]:
import jieba.posseg as pseg
words = pseg.cut("我爱北京天安门")

for word, flag in words:
    print('%s %s' % (word, flag))

词性

北大词性标注集

  • Ag     形语素     形容词性语素。形容词代码为a,语素代码g前面置以A。
  • a       形容词      取英语形容词adjective的第1个字母。
  • ad 副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。
  • an 名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。
  • b       区别词      取汉字“别”的声母。
  • c       连词        取英语连词conjunction的第1个字母。
  • Dg     副语素     副词性语素。副词代码为d,语素代码g前面置以D。
  • d       副词     取adverb的第2个字母,因其第1个字母已用于形容词。
  • e       叹词     取英语叹词exclamation的第1个字母。
  • f        方位词      取汉字“方”的声母。
  • g  语素    绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。
  • h       前接成分   取英语head的第1个字母。
  • i        成语        取英语成语idiom的第1个字母。
  • j        简称略语  取汉字“简”的声母。
  • k       后接成分
  • l        习用语     习用语尚未成为成语,有点“临时性”,取“临”的声母。
  • m       数词     取英语numeral的第3个字母,n,u已有他用。
  • Ng     名语素     名词性语素。名词代码为n,语素代码g前面置以N。
  • n   名词        取英语名词noun的第1个字母。
  • nr  人名        名词代码n和“人(ren)”的声母并在一起。
  • ns      地名     名词代码n和处所词代码s并在一起。
  • nt      机构团体    “团”的声母为t,名词代码n和t并在一起。
  • nz     其他专名    “专”的声母的第1个字母为z,名词代码n和z并在一起。 
  • o       拟声词     取英语拟声词onomatopoeia的第1个字母。
  • p       介词     取英语介词prepositional的第1个字母。
  • q       量词        取英语quantity的第1个字母。
  • r       代词        取英语代词pronoun的第2个字母,因p已用于介词。
  • s       处所词     取英语space的第1个字母。
  • Tg     时语素      时间词性语素。时间词代码为t,在语素的代码g前面置以T。
  • t     时间词      取英语time的第1个字母。
  • u       助词        取英语助词auxiliary 的第2个字母,因a已用于形容词。
  • Vg     动语素      动词性语素。动词代码为v。在语素的代码g前面置以V。
  • v       动词        取英语动词verb的第一个字母。
  • vd     副动词      直接作状语的动词。动词和副词的代码并在一起。
  • vn     名动词      指具有名词功能的动词。动词和名词的代码并在一起。
  • w      标点符号   
  • x       非语素字    非语素字只是一个符号,字母x通常用于代表未知数、符号。
  • y       语气词      取汉字“语”的声母。
  • z      状态词      取汉字“状”的声母的前一个字母。

延展思考:

  • 能够根据分词和词性的情况,做一个简单的机器人聊天软件?

彩蛋:


In [6]:
print('\n'.join([''.join([('YANGYANG'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))


                                                            
                                                            
                                                            
                NGYANGYAN           NGYANGYAN               
            GYANGYANGYANGYANG   GYANGYANGYANGYANG           
          NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN         
         NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY        
        NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN       
        GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG       
        YANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY       
        ANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYA       
        NGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYAN       
        GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG       
         ANGYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG        
          GYANGYANGYANGYANGYANGYANGYANGYANGYANGYANG         
          YANGYANGYANGYANGYANGYANGYANGYANGYANGYANGY         
            GYANGYANGYANGYANGYANGYANGYANGYANGYANG           
             ANGYANGYANGYANGYANGYANGYANGYANGYANG            
              GYANGYANGYANGYANGYANGYANGYANGYANG             
                NGYANGYANGYANGYANGYANGYANGYAN               
                  ANGYANGYANGYANGYANGYANGYA                 
                    YANGYANGYANGYANGYANGY                   
                       YANGYANGYANGYAN                      
                          YANGYANGY                         
                             YAN                            
                              N                             
                                                            
                                                            
                                                            
                                                            

In [ ]: