系列目录

上一篇:Python编程实例02——实现斐波那契数列



前言

关键词:文本分词、split()函数、sort()函数和sorted()函数


一、编程要点

1、split()函数

实现字符串分割的函数有两种用法,如下:

a、单个分隔符分割

vstring = '人生苦短,我用Python!'
#调用split()函数,返回值是一个list类型
vret = vstring.split(',')
print(vret)
print(len(vret))
#打印出
#['人生苦短', '我用Python!']
#2
#------------------------------------
vret2 = vstring.split(',!')
print(vret2)
#打印出:['人生苦短,我用Python!']
print(len(vret2))
#打印出:1

由以上样例代码可以看出,split()函数把传入的参数(字符)当成一个整体的分割符。要想应用多个分隔符分别对字符串进行分割,要用到re模块中的split()函数。

b、多个分割符分割

#导入模块
import re
#字符串
vstring = '人生苦短,我用Python!Python高效、优雅,很多人喜欢。OK'
#'[,!、。]',是第一个参数,注意其格式
vret = re.split('[,!、。]',vstring)
print(vret)
print(len(vret))

输出结果:

[‘人生苦短’, ‘我用Python’, ‘Python高效’, ‘优雅’, ‘很多人喜欢’, ‘OK’]
6

可以看出re.split()函数的第一个参数是正则表达式,第二个参数是要分割的字符串,在这个字符串中凡是匹配到第一个参数指定的表达式的字符都可以成为成为分割符,这样就实现了用多个字符串来分割字符串的功能。

2、sorted()函数与sort()函数

字典类型的变量中的项(键值对)是无序排列。当需要对字典型数据的项进行排序时(按键名或者键值排序),就需要使用到sorted()函数和sort()函数。这两个函数的实现的功能时一样的,区别如下

  • sort()函数:直接根据原对象进行排序,即改变了原对象的排列形式
  • sorted()函数:重新生成一个排列好顺序的对象,不改变原对象。

下面列举sorted()函数的样例,分别是按照键名和键值排序的情况。

#字典赋值
dic = {'a':100,'c':200,'b':90,'d':10,'g':101,'e':88,}
#调用sorted(),返回vret是一个列表变量
vret = sorted(dic.items(),key=lambda item:item[0])
print(vret)
vret = sorted(dic.items(),key=lambda item:item[1])
print(vret)

输出结果:

[(‘a’, 100), (‘b’, 90), (‘c’, 200), (‘d’, 10), (‘e’, 88), (‘g’, 101)]
[(‘d’, 10), (‘e’, 88), (‘b’, 90), (‘a’, 100), (‘g’, 101), (‘c’, 200)]

以上代码可以看到sorted()函数的第一个参数是参与排序的字典各项,第二个参数是key,key通过lambda函数返回指定排序的数据项,lambda函数中的item表示字典中的元素项,每个元素项都由键名和键值组成,由上可知,item[0]-----键名,item[1]-----键值。在代码中,item[1]将键值返回给key表示以键值大小作为排序依据对字典各项排序。
补充说明:

lambda函数是匿名函数,lambda n:m表示输入n,返回处理结果m。
e.g.
lambd a,b:a*b 表示输入a,b返回它俩的乘积a*b

二、代码实现

目标:将文本文件中的英文单词找出来,进行英文单词分词,并统计每个单词的词频。
原文件:test.txt

Three years ago, I accidentally realized that my handwriting looks sort of ugly; however, my best friend’s handwriting is real nice as an art. Then I have a passion for the beauty of handwriting, so I decided to practice calligraphy. But the result of half-year practice was unsatisfied than expected. I was very frustrated and want to give up. My friend found my sadness about that, she encouraged me and gave some advice like there was something wrong with my way to hold the pen. She corrected the holding position and encouraged me that I could do better while kept practicing. With her enthusiastic help, I stick at doing the calligraphy exercise and I have better handwriting than before. Actually, I find joy in it and the exercises become one of my habits and hobbies. Therefore the key to success consists in your persistence of the intention.

代码如下:

#导入模块
import re

#定义函数 
#功能:通过该函数查找文本字符串中,每一个英文单词出现的次数
#最后按照字数从多到少放到列表中
def get_char(txt):
    #将分割后的单词放到列表vlist中
    vlist = re.split('[:;,."\s]\s*',txt)
    #生成字典
    vdic_frequency = dict()
    for vchar in vlist:
        if vchar in vdic_frequency:
            #如果存在该单词,次数加1
            vdic_frequency[vchar] +=1
        else:
            #如果不存在该单词,增加对应的单词,键值赋为1
            vdic_frequency[vchar] = 1
    #字典中的项按键值排序,并且是倒序排列(reverse=True)
    vdic_sort = sorted(vdic_frequency.items(),key=lambda item:item[1],reverse=True)
    return vdic_sort

#test.txt是同一个目录下的英文文章
with open('test.txt','r') as f:
    vtext = f.read()
vstr = get_char(vtext)
print('列出文本中的英文单词:\n')
print(vstr)

部分结果如下:

列出文本中的英文单词:
[(‘I’, 8), (‘the’, 8), (‘and’, 6), (‘my’, 5), (‘of’, 5),(‘handwriting’, 4), (‘to’, 4), (‘that’, 3), (‘was’, 3), (‘have’, 2),(‘practice’, 2), (‘calligraphy’, 2), (‘than’, 2), (‘encouraged’, 2), (‘me’, 2), (‘better’, 2), (‘in’, 2), (‘Three’, 1), (‘years’, 1),(‘ago’, 1), (‘accidentally’, 1), (‘realized’, 1), (‘looks’, 1), (‘sort’, 1), (‘ugly’, 1), (‘however’, 1), (‘best’, 1),…]

要点介绍:

  • re.split()函数第一个参数是指定以:;"和空格(\s)以及0个或者多个空格作为(\s*)作为分割符。第二个参数则是要拆分的字符串。
  • txt文件的读取:
    with open('test.txt','r') as f: vtext = f.read()

总结

本文就英文文本单词之间的规律对英文文本进行分词和词频统计。若是想对中文文本进行分词,感兴趣的朋友可以使用jieba库进行分词,如文本内容过大而导致分词效率低下,可以使用jieba-fast。只需由import jieba变成import jieba-fast as jieba即可完美适用。
最后你的一键三连,是我的码字动力。(好吧,哪怕下次一定,我好像也是会继续更新,哈哈哈)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐