当前位置:   article > 正文

Python实现基于TF-IDF抽取文本数据关键词_tfidf关键词提取代码

tfidf关键词提取代码

      结束了一整天的工作,来写一点东西记录一下吧。今天主要就是实现一下TF-IDF算法,这个相信接触过文本数据处理的人来说简直就是小儿科,所以原理什么的我就不多累赘了,这里直接看代码:

  1. #!usr/bin/env python
  2. #encoding:utf-8
  3. from __future__ import division
  4. '''
  5. __Author__:沂水寒城
  6. 功能: TF-IDF算法
  7. TF-IDF实际上是:TF * IDF
  8. TF:词频(Term Frequency)
  9. IDF:逆文档频率(Inverse Document Frequency)
  10. '''
  11. import os
  12. import re
  13. import sys
  14. import xlrd
  15. import math
  16. import json
  17. import jieba
  18. import sklearn
  19. import numpy as np
  20. import jieba.analyse
  21. if sys.version_info==2:
  22. reload(sys)
  23. sys.setdefaultencoding( "utf-8" )
  24. def dataPrepossing(one_line):
  25. '''
  26. 数据内容去除无效字符,预处理
  27. '''
  28. sigmod_list=[',','。','(',')','-','——','\n','“','”','*','#',
  29. '《','》','、','[',']','(',')','-','.','/','】','【']
  30. for one_sigmod in sigmod_list:
  31. one_line=one_line.replace(one_sigmod,'')
  32. return one_line
  33. def seg(one_content, stopwords=[]):
  34. '''
  35. 分词并去除停用词
  36. '''
  37. segs=jieba.cut(one_content, cut_all=False)
  38. # segs=[w.encode('utf8') for w in list(segs)]
  39. segs=[unicode(w) for w in list(segs)]
  40. seg_set=set(set(segs)-set(stopwords))
  41. return list(seg_set)
  42. def cutData2Words(dataDir='data/',save_path='cut_words.json'):
  43. '''
  44. 将原始的文本数据切分为词数据
  45. '''
  46. result={}
  47. txt_list=os.listdir(dataDir)
  48. for one_txt in txt_list:
  49. one_name=one_txt.split('.')[0].strip()
  50. one_txt_path=dataDir+one_txt
  51. with open(one_txt_path) as f:
  52. one_data=f.read()
  53. one_words_list=seg(one_data)
  54. result[one_name]=one_words_list
  55. with open(save_path,'w') as f:
  56. f.write(json.dumps(result))
  57. def calWordsIdf(data='cut_words.json',save_path='word_idf.json'):
  58. '''
  59. 将整个语料库读入矩阵,并计算每个词的idf值,写入文件
  60. '''
  61. with open(data) as f:
  62. data_dict=json.load(f)
  63. word_doc_list=[]
  64. for one_key in data_dict:
  65. word_doc_list.append(data_dict[one_key])
  66. word_dict={}
  67. for one_list in word_doc_list:
  68. for one in one_list:
  69. if one in word_dict:
  70. word_dict[one]+=1
  71. else:
  72. word_dict[one]=1
  73. print('='*60)
  74. idf_dict={}
  75. n=len(word_doc_list)
  76. for one_word in word_dict:
  77. idf_dict[one_word]=math.log(n*1.0/word_dict[one_word])
  78. with open(save_path,'w') as f:
  79. f.write(json.dumps(idf_dict))
  80. def calTxtKeyWords(data='data/1.txt',topK=30):
  81. '''
  82. 计算单个文件数据的关键词[基于TF-IDF值降序筛选]
  83. '''
  84. with open('word_idf.json') as f:
  85. idf_dict=json.load(f)
  86. with open(data) as f:
  87. content=f.read()
  88. words_list=seg(content)
  89. tf_dict={}
  90. for one_word in words_list:
  91. if one_word in tf_dict:
  92. tf_dict[one_word]+=1
  93. else:
  94. tf_dict[one_word]=1
  95. tfidf_dict={}
  96. for oneW in tf_dict:
  97. try:
  98. tf=tf_dict[oneW]
  99. idf=idf_dict[oneW]
  100. tfidf_dict[oneW]=tf*idf
  101. except Exception,e:
  102. pass
  103. #print 'Exception: ',e
  104. sorted_list=sorted(tfidf_dict.items(),key=lambda e:e[1], reverse=True)
  105. for one in sorted_list[:5]:
  106. print(one)
  107. return sorted_list[:topK]
  108. if __name__ == '__main__':
  109. print('Loading.............................................')
  110. #数据集分词
  111. cutData2Words(dataDir='data/',save_path='cut_words.json')
  112. #计算词的逆文档频率
  113. calWordsIdf(data='cut_words.json',save_path='word_idf.json')
  114. #计算文档 1.txt 对的关键词
  115. calTxtKeyWords(data='data/01.txt',topK=30)

      测试所用的数据内容如下所示:

由于限制原因未能上传

      分词结果如下所示:

由于限制原因未能上传

       IDF值计算如下所示:

由于限制原因未能上传

      由于限制原因未能上传自己使用的语料数据,感兴趣的话可以自己找一篇文章试试,语料集我用的很小,这里最好用一个比较大的语料数据集来计算IDF值,这样最终计算得到的TF-IDF值可靠性较高。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/342907
推荐阅读
相关标签
  

闽ICP备14008679号