鱼C论坛

 找回密码
 立即注册
查看: 3055|回复: 11

[技术交流] Python:每日一题 117

[复制链接]
发表于 2017-10-26 15:07:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考,再参考各位大神的答案,这样才有助于提高自己的编程水平。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:用Python解读十九大报告
最近的十九大报告出台,报告中例举了非常多关乎我们民生的重要议题。
那么请你用Python来解读一下,究竟报告中有哪些关键词,整体报告传达了怎样的意思?

提示:分词、词频统计

如果会画词云图,有加分!

十九大报告原文下载:
report.zip (29.8 KB, 下载次数: 36)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-26 16:36:20 | 显示全部楼层
偷个懒直接用了jieba的分词引擎。。。。。
结果就是去掉无意义的词那么出现次数最多(超过100次)的就是:
('党', 107), ('坚持', 132) ('社会主义',146), ('建设', 151), ('人民', 157), ('中国', 168), ('发展', 212)
  1. import jieba

  2. with open(r'D:\report.txt','r',encoding='utf-8') as f:
  3.     jb=jieba.cut(f.read(), cut_all=False, HMM=True)

  4.     tf={}
  5.     for i in jb:
  6.         #print seg
  7.         i = ''.join(i.split())
  8.         if (i != '' and i != "\n" and i != "\n\n") :
  9.             if i in tf :
  10.                 tf[i] += 1
  11.             else :
  12.                 tf[i] = 1
  13.     print(sorted(tf.items(),key=lambda item:item[1]))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
jerryxjr1220 + 2 + 2 + 1 词频统计可以用Counter

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 20:40:47 | 显示全部楼层
先上一下本题的,用了结巴
  1. import jieba.analyse
  2. def func():
  3.     path = r'C:\py\doc\prom\report.txt'
  4.     with open(path) as f:
  5.         data = f.read()
  6.     tags = jieba.analyse.extract_tags(data,20)
  7.     text_split = jieba.cut(data, cut_all=False)
  8.     text_list = list(text_split)
  9.     d =dict()
  10.     for i in range(20):
  11.         d[tags[i]] = text_list.count(tags[i])
  12.     print(d)
  13. func()
复制代码


下面是做了个英文的【i have a dream】的演讲稿。想不用包来弄。
  1. path = r'C:\py\doc\prom\oxo.txt'
  2. words_list = []
  3. with open(path) as f:
  4.     text = f.read()

  5. # 拆分剔除标点,存放所有单词,这儿有个问题,就是英文中的双引号,去不掉。
  6. text = text.split('\n')
  7. for i in text:
  8.     for j in i.split(' '):
  9.         if j[-1] in {':', ',', '"', '?', '!'}:
  10.             j = j[:-1]
  11.         elif j[0] == '"':
  12.             j = j[1:]
  13.         words_list.append(j)

  14. # 单词和个数 对应存入字典
  15. words_dict = dict()
  16. for i in set(words_list):
  17.     words_dict[i] = words_list.count(i)

  18. top_word = list()
  19. # 只取前20多的单词
  20. top_word = sorted(zip(words_dict.values(),words_dict.keys()), reverse=True)
  21. for i in range(20):
  22.     print(top_word[i])
复制代码

运行后得出的结果,只能说是单词的统计,算不上统计。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
jerryxjr1220 + 3 + 3 + 2 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-30 18:52:05 | 显示全部楼层
楼主你出的题目都很有特地哈
这个难点在分词吧,还没接触过相应的工具库,
手动的话,我想将文本连续2个字、3个字、4个字取,应该就包含单词了
然后统计个数,最后肯定会有“我们的”、“,”、“。”这些用得多但是不关键的
只能人工分辨了
  1. path = "report.txt"
  2. nums = (2, 3, 4)
  3. counter = {}

  4. with open(path) as file:
  5.     for row in file:
  6.         for num in nums:
  7.             for i in range(len(row)):
  8.                 try: # 每行最后两个字会多统计几次,不过都是标点符号,算了
  9.                     counter[row[i: i+num]] += 1
  10.                 except KeyError:
  11.                     counter[row[i: i+num]] = 1
  12.     file.close()

  13. result = sorted(counter.items(), key=lambda x:x[1], reverse=True)
  14. print(result[:20]) # 给出前20
复制代码

结果是这样的
  1. [('社会', 262), ('发展', 232), ('人民', 206), ('中国', 194), ('主义', 189), ('建设', 168), ('会主', 152), ('社会主', 152), ('会主义', 146), ('社会主义', 146), ('。 ', 140), ('坚持', 133), ('国家', 115), ('制度', 101), ('全面', 95), ('政治', 94), ('党的', 91), ('实现', 88), ('民族', 81), ('推进', 81)]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-31 06:19:12 From FishC Mobile | 显示全部楼层
solomonxian 发表于 2017-10-30 18:52
楼主你出的题目都很有特地哈
这个难点在分词吧,还没接触过相应的工具库,
手动的话 ...

你这是用英语分词的方法进行中文分词啊
一般中文分词库的做法是根据常用词语进行分词,所以词语库的好坏就决定了分词的质量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-31 09:45:05 | 显示全部楼层
QQ图片20171031094331.png

因为我之前有做过现成的东西,也就是换个文本的事情。代码里面因为还有停用词库这种东西,就不放了,百度随便搜搜很多的那种。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 14:03:39 | 显示全部楼层
今天看到了Counter。感觉英文单词统计用这个真的简单的不要不要。。。我之前手写的完全就是渣渣。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 18:40:49 | 显示全部楼层
去瞄了一下,发现如果工具包还挺简单的,补上个小示范
  1. import jieba.analyse
  2. from wordcloud import WordCloud

  3. path = "report.txt"
  4. topK = 20 # 出现频率排前20的热词

  5. with open(path) as f:
  6.     text = jieba.analyse.extract_tags(f.read(), topK=topK) # 这货是个生成器
  7.     word_cloud = WordCloud(font_path='simsun.ttc', background_color='white',width=600,
  8.                            height=480).generate(" ".join(text)) # 这个text参数要字符串
  9.     word_cloud.to_file("report.png")
  10.     f.close()
  11. print("done!")
复制代码

report.png

report.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 20:07:22 | 显示全部楼层
ooxx7788 发表于 2017-10-31 09:45
因为我之前有做过现成的东西,也就是换个文本的事情。代码里面因为还有停用词库这种东西,就不放了,百 ...

好像很久没看到你,啥方法别藏着掖着,拿出来大伙参考参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-1 22:41:37 From FishC Mobile | 显示全部楼层
solomonxian 发表于 2017-11-1 20:07
好像很久没看到你,啥方法别藏着掖着,拿出来大伙参考参考

就是很简单啊,把你这个代码封装一下,就变成只要给个文本就可以出图的了。代码满大街都是,也就懒得上了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-1 10:41:28 | 显示全部楼层
import jieba.analyse

content=open('report.txt').read()

tags=jieba.analyse.extract_tags(content,20)

text_list=jieba.lcut(content,cut_all=False)

dict1={}

for i in range(20):
    dict1[tags[i]]=text_list.count(tags[i])

print(dict1)
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 13:08:47 | 显示全部楼层
不是很明白要做什么……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 21:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表