初学python,词频统计小实验

您所在的位置:网站首页 python文本统计单词 初学python,词频统计小实验

初学python,词频统计小实验

#初学python,词频统计小实验| 来源: 网络整理| 查看: 265

最近突然对python感兴趣,就学了起来。我可怜的计算机基础只有VB,而且学的时候这门课还特别水,仅仅了解了语法,考试基本上是背题过的。

现在自学python还是比较吃力。今天捣鼓了一下午,搞出了一个词频统计的程序,敲了三四十行代码,还是十分有成就感。本着输出是为了更好的理解知识的初心,我来谈谈我是怎么写的,用的那些方法。毕竟是刚接触的小白,很有地方走了弯路,用的可能不是很好的方法,很多理解上或许有很多偏差。 不过没关系,有大佬指出我错误的地方,我会很感激的;若有同小白的受到了启发,我会很开心的。

先说说词频统计我是怎么想的,用到了什么方法?再谈谈我遇到的困难和展现的实际效果。最后放出我的代码

词频统计肯定是要对字符串进行处理。将英文的单词,中文的词语给拧出来,还要统计他们出现的次数,最后再做个排序,通常是从高到低。英文进行分词不需要用到第三方库,直接使用".spite()"方法进行处理就行了。中文的分词要用到“jieba(结巴)”库,再敲一行代码就可以了。

words = jieba.lcut(txt) #words 是分开的一个一个词的集合,txt是要分词的文本

等等,既然我有两种分词的方式,一个是对英文的,另一个是对中文的,而且要写在一个程序里面。我需要做一个分支结构,谁知道我某天要拿中文还是英文来做词频统计呢?于是我用if else 语句做了一个简单的分支。

print("1.英文单词词频统计。\n2.中文词语频率统计。") option = input("请选择要进行的词频统计类型,填数字:") if option == 1: ......... else:

做到这里,该想想到底该怎么进行统计。我要打开一份文件,怎么打开呢?其实也不难不过我发现英文和中文还是不一样的。请看代码。

txt = open( s ,"r") #s表示文件所在的路径。“r”表示只读,当然还有其他模式 txt = open( s ,"r",encoding='utf-8') #后面多了一串是为了可以对中文进行分词,英文不用写

顺便就用一个变量 s(或者其他)作为一个输入值,这样我打包之后就可以对各种文本进行词频统计。不过我发现,这只能导入txt文件,doc,pdf不行。所以还得多一步新建一个记事本。

怎么统计词频,当然是使用字典键值一一对应。把分好的词导入到词典里,使用遍历循环,若有相同的词,后面的值就加一,岂不妙哉?方法明晰了,实现则对于我这个小白来说有些困难。就把分好的一堆词叫做words,word表示一个词,当然还要建立一个词典使用for in语句,从words中取出每一个word,并在词典里进行判断。若word在词典里,那太好了,后面的值加一,若不在,那么新建一个索引(或者项,术语我忘记了,懒得查了),默认值为1。这样就可以进行统计了。代码如下:

for word in words: if word not in cidian: cidian[word] = 1 else: cidian[word] = cidian[word] + 1

接下来就是排序,根据词频将单词或词语排列出来。

为了方便先将词典转换为列表。然后列表有一个sort方法(说来惭愧,具体原理我不太清楚),可以按值的大小从小到大排(之所以这么说是因为“升序”“降序”我傻傻分不清),然后在翻转过来就可以了。代码如下:

items = list(cidian.items()) #cidian 是词典 items.sort(key=lambda x: x[1], reverse=True)

最后用range函数打印出来就可以了,打印多少由你来定。代码就不放了,想看的就放在最后了。

简单的运行了一下,发现问题还不少。比如英文中奇怪的标点符号,大小写问题等等,中文中一堆单个的词。那么就要把他们清除掉,使用replace,lower等等。做个if语句如果,中文单词只有一个那么就不要统计了,有些同义的词语可以“合并同类项”这些就是多写几个if分支的问题了。最后使用pyinstaller进行打包搞定。不过打包之后的exe文件竟然有200多m那么大,我简直懵逼了。也不清楚为啥,我也只用了jieba一个库呀。希望有大佬能够解答。

不到40行的代码,却有200兆。

我对哈佛大学幸福课的文本进行了统计,效果如下。

效果还可以,但还可以进行优化,比如把那些连词去掉,还有“我们”“你们”等给去掉。不过也可以看出老师多次强调“自尊”“积极”“快乐”“成功”等词。

好了,今天所有要分享的内容都在这里了,希望对python感兴趣的朋友们点个赞,留个言,共同探讨学习。

最后附上全代码。

print("该程序可以进行词频统计。\n请注意选择中文词语或者英文单词。") print("1.英文单词词频统计。\n2.中文词语频率统计。") # noinspection PyUnresolvedReferences import jieba cidian = {} k = 1 while k > 0: option = input("请选择要进行的词频统计类型,填数字:") wenben = input("注意文件路径格式。\n例如:E:\\python学习\\03实战演练\\文本.txt\n请输入文件路径:") if option == 1: txt = open(wenben, "r").read() txt = txt.lower(txt) for n in '.,?!': txt = txt.replace(n," ") words = txt.split() for word in words: if word not in cidian: cidian[word] = 1 else: cidian[word] = cidian[word] + 1 else: txt = open(wenben, "r", encoding='utf-8').read() words = jieba.lcut(txt) for word in words: if len(word) == 1: continue else: if word not in cidian: cidian[word] = 1 else: cidian[word] = cidian[word] + 1 items = list(cidian.items()) items.sort(key=lambda x: x[1], reverse=True) num = eval(input("你想显示前多少个最高单词/词语:")) for i in range(num): word, count = items[i] print("{0:5}".format(word, count))



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3