Python词频分析

来源:互联网 发布:amd处理器优化 编辑:程序博客网 时间:2024/05/17 03:28

我想写一个程序分析一本书各个单词出现的频率。在阅读之前,先找出其中单词出现频率高我还不认识的单词,事先背上,然后再阅读。

思路:

把TXT文件里面所有的英文单词储存在一个list里面(注意,里面的元素有重复的。)用for循坏分析list里的每一个元素,建立一个单词为key,出现次数为value的dictionary。然后进行排序。

# -*- coding: utf-8 -*-  import re  f = open("file to analyse.txt","r")  wordlist = []  freqdic = {}  '''      将list中各个元素出现的数目进行统计,放入freqdic中。  '''  def countfreq(list):      for i in list:          if i in freqdic:              freqdic[i] += 1          else:              freqdic[i] = 1  for line in f.readlines():      str = line.lower()      singlelinelist = re.split("\W+",str)#re.split没有去除文本中的数字,数字会在后面的程序中进行处理。      countfreq(singlelinelist)  t = []  '''   因为dictionary对value大小进行排序并不方便,所以将dictionary转变为list,从而进行排序。  '''  for key,value in freqdic.items():      if key.isalpha():#只保留key是英文单词的元素          t.append((value,key))  t.sort(reverse=True)  print t  f.close()  

结果一览:
这里写图片描述
looks great,right?

我的目标是找出出现频率高并且自己不认识的词,可是上面的结果把TXT文件中出现的所有单词都找出来了——几千个,而我想要的只有那么几十几百个。显然,程序需要进一步改进。
于是下一个目标:建立一个过滤列表,词频分析的结果里不应该出现该列表里的单词。

我的英语不算差,四级的单词,基本是没问题的。于是我的目标变成了:寻找四级单词与词频分析结果里的都有的单词,并剔除这些重复的单词。

我加了如下代码:

four = open("Desktop/final.txt","r+")oklist = []#return a set contains all the words i already know.for i in four.readlines():    oklist.append(i.strip('\n'))okset = set(oklist)bookset = set(freqdic)t = []common = bookset & oksetknown = list(common)for i in known:    del freqdic[i]

结果一览:
这里写图片描述
Great! 里面大部分是不认识的单词,现在挑选可就轻松多了!

四级单词表示我从网上下载的。我在网上找到的四级词汇里只有原型,而没有它们的复数,副词过去分词等等,我自己写了一个程序,为每一个动词加上了ing,ed,s.每一个形容词加上了ly,每一个名词加上了s.并把这些单词加入过滤列表里。
随着词汇量的增多,过滤列表也可以随时更新。

全部的代码如下:

# -*- coding: utf-8 -*-import reimport sysfilename = sys.argv[1]four = open("Desktop/final.txt","r+")last = open("Desktop/%s.txt" % (filename + "word") ,"w+")oklist = []#return a set contains all the words i already know.for i in four.readlines():    oklist.append(i.strip('\n'))okset = set(oklist)f = open("Desktop/%s.txt" % filename,"r")freqdic = {}#provided a word list,return a dic which contains the freq.def countfreq(list):    for i in list:        if i in freqdic:            freqdic[i] += 1        else:            freqdic[i] = 1#count the freq of the file provided.for line in f.readlines():    st = line.lower()    singlelinelist = re.split("\W+",st)    b = []    for i in singlelinelist:        b.append(i.strip("_"))    countfreq(b)'''这里我加了一个功能,把如果一个单词比如说love,如果这个单词末尾加了一个s也在这个书籍的单词列表里,在这里是loves,那么就删除loves,并把loves出现的次数加入到love下。因为这实在太常见了。'''dellist = []for i in freqdic:    if len(i) > 1 and i[-1] == "s":        if i[:-1] in freqdic:            freqdic[i[:-1]] += freqdic[i]            dellist.append(i)for i in dellist:    del freqdic[i]bookset = set(freqdic)t = []common = bookset & oksetknown = list(common)for i in known:    del freqdic[i]#return a freq turple.for key,value in freqdic.items():    if key.isalpha():        t.append((value,key))#write turple into a txt file.#这里我把得到的结果放到了TXT文件里,因为在shell里查看实在太麻烦了。for i in t:    last.write(i[1] + "\n")print tf.close()   last.close()
1 0