python第三天(dictionary应用)转

1.题目:

python实现英文文章中出现单词频率的统计

 

前言:

这道题在实际应用场景中使用比较广泛,比如统计历年来四六级考试中出现的高频词汇,记得李笑来就利用他的编程技能出版过一本背单词的畅销书,就是根据词频来记单词,深受学生喜欢。这就是一个把编程技能用来解决实际问题的典型场景。另外,在数据分析时,那些词云效果本质上都是基于词频统计来调整字体的大小,如果你能熟练运用Python中的知识来解决问题的话,说明你真的入门Python了。

 

分析

本题主要考察以下几个方面的知识点:

1、如何正确读写文件

在python中读写文件可以使用内置函数open(),而 open 函数在python2 和 python3 中有一定的区别,比如 Python 中可以指定读写文件的编码格式,而 Python 则不可以,为了同时兼容2和3,我们通常会使用io模块下面的 open 函数,大家可以查文档搞清楚它们之间的区别,培养主动学习能力和查资料的习惯。

另外一点是读写文件完成之后是需要关闭文件描述符的,除了可以使用 try...except...finally的语法之后,我们还可以使用更优雅的 with … as 的语法来自动关闭文件。

2、如何对数据进行排序

sorted函数是一个使用频率很高的内置函数,它的用法也很强大,因为它可以通过指定参数 key 来进行自定义排序,也就意味着你不仅可以对数字排序、对字母排序、还可以对列表、字典、自定义的对象进行排序,你只需要要告诉 sorted 函数的排序规则是什么,比如一个people对象,我既可以根据年龄排序也可以根据身高体重来排序,所以这个函数时非常灵活的,另外,对于列表对象有自带的 sort 方法,如果能区分清楚 list.sort 与 sorted 之间区别那说明你已经能灵活运用了。

3、字典数据类型的运用

做词频统计,用字典无疑是最合适的数据类型,单词作为字典的key, 单词出现的次数作为字典的 value,很方便地就记录好了每个单词的频率,字典很像我们的电话本,每个名字关联一个电话号码。另外,字典最大的特点就是它的查询速度会非常快。理想情况下时间复杂度为O(1),我是说理想情况,如果你想深入了解字典的话,建议看看这篇文章 https://www.laurentluce.com/posts/python-dictionary-implementation/

4、正则表达式的运用

对文本、字符串处理,正则表达式简直是神器,无论是做数据爬虫还是数据清洗使用非常广泛,当然,正则表达式并不是Python特有的东西,所有编程语言都支持,我们要做的除了学习正则表达式还有他的API,只有熟悉了API我们才能运用到实际场景中去。关于正则表达式推荐一篇文章:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html ,另外我还发现有同学引入了jieba分词库,这个库在做中文分词非常有用,感兴趣的可以去了解一下。

 
python实现英文文章中出现单词频率的统计

本文的思路:
首先打开文件 ,对于文件的每一行进行词汇的统计,在这里需要注意 需要替换每一行中的单词之间的分隔符为空格,然后使用split()函数去掉空格,这样每一行剩下的就是纯粹的单词,然后遍历每一行中的每一个单词,将已经出现在字典中的单词,频次直接+1就行(这里需要用到字典中根据键来查找值的操作:dictionaryName[key]+=1)
由于很多时候我们只需显示出现频次最多的前多少条所以这里需要对频次进行排序,经过上一个步骤我们已经吧单词以及对应的频次存储在字典中,接下来使用items()函数和list(dictionaryName.items())把字典中的键值对构成列表,这一步之后可以转化为[(key1,value1),(key2,value2)….] ,这样就可以通过访问二位列表中元素的方法进行访问每个单词以及出现的频次了

# -*- coding: utf-8 -*-
def main():
   file=open("C:\py\count_word.txt",'r')
   wordCounts={}
   count=10
   for line in file:
     lineprocess(line.lower(),wordCounts)
   items0=list(wordCounts.items())
   items=[[x,y] for (y,x) in items0]
   items.sort()
   for i in range(len(items)-1,len(items)-count-1,-1):
	   print(items[i][1]+"\t"+str(items[i][0]))
def lineprocess(line,wordCounts):
  for ch in line: 
     if ch in '~@#%^()_-+=<>?/,.:;{}[]|\'"' :
        line=line.replace(ch," ")
  words=line.split()
  print(words)
  for word in words:
     if word in wordCounts:
         wordCounts[word]+=1
     else:
         wordCounts[word]=1

  

 

 

posted @ 2018-10-20 21:51  zzlp  阅读(297)  评论(0编辑  收藏  举报