今天看到的一个讨论

本文讨论了计算机专业学生在大学期间学习编程基础的重要性,特别是编译原理和数据结构这两门课程的实际应用。作者指出,具备扎实的编程基础对于日后从事软件开发工作至关重要。

今天在搜索平衡二叉树操作代码时,看到了天涯的一个讨论帖。觉得很不错,很有警示意义。转过来,以示警醒。

 

      

IT视界』 [软件]用人单位给计算机系学生的一封信
            

 今天上午又去招聘了,加上前面一段时间的招聘经验,有些话不吐不快
  
  我们希望找到能干活的人,就是能编程序的人,但是我感觉现在刚毕业的人里面,包括名校的,能干活的人比例非常的低,大概不超过百分之一
  
  很多人都说,没有参加过实际的项目,没有经验,希望能够在工作过程中学习等等,开始的时候我也这样认为,随着面试的人的增多,手下新人的增多,我的看法逐渐变了
  
  不谈个人主观能动性方面的种种问题,我想谈谈我心目当中的科班出身编程序选手的及格线
  
  如果你希望编程序为生的话,那么,大学才是你最重要的经验积累地点,相反,工作单位能够积累的东西很少,或者说绝对是第二位的
  
  大学里面,最重要的课程有两门,一门是编译原理,一门是数据结构,这两门课的课程都不重要,重要的是课程设计,也就是老师让你上机做的题目,就我这段时间面试的上百人来说,我认为其中的九十九个,这两门课的课程设计要么是直接复制别人的,要么是蒙混过关的[只碰到一个真刀真枪作过的],其实,这两门课是你大学里所有学习内容当中对编程序的能力进行训练的最根本内容,也是你在社会上永远碰不到的学习机会,任何,不论多贵的培训机构,也不可能给你提供这两门课的训练深度,我见过太多的毕业之后又花一两万块参加各种形式的培训机构培训一年的选手了,你学会一万种框架的配置方法,也不如你大学的时候把这两门课上好有意义
  
  编译原理的课程设计,一般来说要求做一个词法分析器或者语法分析器,最屁要你做一个数学公式的逆波兰式解析,我个人看法词法分析器或者语法分析器都可以,单作逆波兰式,则最好能够做到支持各种类型的运算的地步,比如逻辑运算等等,这门课的课程设计如果能够独立完成,可以在你的大脑里面创建一个整体化的计算机思考方式,最重要的是,这个过程能够让你学会面对一个复杂问题的时候,如何通过各种计算机语言来解决问题,、、、,好处不再列举,其实你毕业之后参加的任何培训,其算法复杂程度都不可能和这门课程相比
  
  数据结构的课程设计,关键点在于两个,一个是数据结构和算法本身,这里需要理解和学习的主要内容是循环和递归等等,其实如果你上面一个做得好,这些都不是太大问题了,学习一下各种数据结构的应用还有些意义;第二个最重要的训练目的,就是如何在计算机当中表达问题的问题,很多人跟我说,我的课程设计是二叉树排序,输入就是我自己输进去一堆数字,输出就是把这些数字排好了再输出到屏幕上、、、faint,晕倒,讲一个汉诺塔的例子吧:
  汉诺塔本身的算法只有二十几行,不太好理解,但是也不难理解,那么,如果希望做一个东西,把汉诺塔表达一下,应该考虑什么东西呢?
  首先,需要考虑清楚几个塔,个个盘子,应该用什么表达,用什么数据结构表达?这个是一个关键问题,需要能够把塔和盘子和数组以及数组里面的元素对应起来思考问题,不要看这一点简单,实际上太多人根本就没有办法在大脑里面完成这个转换、、
  其次,要考虑清楚其中有哪些元素可能发生变化,盘子的数目是最简单的变化元素了,有没有其它的了呢?
  有,移动的速度,如果你移动得太快,那么谁也看不清楚,你等于什么也没做、、那么,至少两个元素要可变,一个是移动速度,一个是盘子数目
  好,轮到表达方式了,你要是牛的话,就画成棍子上面穿着有洞的盘子,不行的话就竖线上面穿横线,移动的过程,牛的话做成动画??不行的话就演示每个步骤地结果既可
  好,该怎么画出来呢,这个时候你就要弄明白如何在屏幕上划线,这个简单,重要的是如何擦掉一条线,还不能把棍子的那个点擦掉,这就有点问题了、、
  好了,上面问题都解决完毕之后,用什么语言编程序就很次要了,c也好,pascal,java,任何语言,一个带两个参数的动画演示汉诺塔的东东就出世了、、、[我花了一个半小时]
  
  数据结构的学习过程中,如果能够在四五个题目上面做到上面的深度,相信你绝对受欢迎
  
  以上两个课程设计,如果都能够独立完成,一般来说毕业后两三年内收入必然超过五千,如果在北京上海,应该可以肯定超过一万

 

 

作者: 菩提道次第 回复日期:2006-12-17 17:21:45
 
 
  编译原理的课程设计应该在两个月之内完成,数据结构的则应该一个专题一周左右完成,四五个专题就足够了
  
  老师没有给你相应的任务不要紧,自己给自己出题目太容易了
 
作者: seeming 回复日期:2006-12-17 17:23:24
 
 
  说得不错,这两门课很重要
 
作者: o_xyz 回复日期:2006-12-17 17:29:54
 
 
  我觉得编码能力倒是次要的。关键是思想什么的,像面向对象啊之类的。理解了这个思想,编码就没什么大问题,语法等的错误很容易debug出来。
 
作者: 菩提道次第 回复日期:2006-12-17 17:33:33
 
 
  最崩溃的对话:
  编译原理的课程设计做了什么?
  语法分析器
  语法分析器干什么的?
  分析语法的
  、、、、、用没用堆栈,怎么用的?
  、、、、、、、、、忘了,大二做的,时间太长了、、
  、、、、、、我都毕业十二年了我还记得、、、
  、、、、这不对,我来面试java程序员,你问我编译原理干什么??
  扑通、、
 
作者: tuishu 回复日期:2006-12-17 19:13:39
 
 
  楼主,我很欣赏你写的东西和你的看法。
  
  我是刚毕业不久的大学生,可以说我应该可以代表当代大学生说点了。
  在学校里学数据结构学编译原理,每天都会有人在耳边说这两门课很重要。但是当我们学完了的时候还没有人能知道它是用来做什么的。
  
  我也可以告诉你很多学校对这两门课的态度,C语言2个月,学完马上考试,接着就学数据结构,2个月不到就结业考试。大家都知道一个学期是4个半月,每门考试需要一周,最后2周基本没事。还有多少时间给你,在学校最经典的一句话我相信大家都熟悉吧。“只有到考前一、两周才是大家最有收获的季节。”
  我后来自学过数据结构,我感觉自己学的比老师给我讲的更有收获。
  课程设计就更不用说了,社会的腐败早就已经传到学校里了。现在还有哪个地方是洁净的。记得数据结构的课程设计就是老师给我们花了3次课程讲了2个例子,八皇后问题和马跳棋盘。
  这种情况下100个人能出1个高手已经是很高的概率了。呵呵
  楼主:这个问题不是某个人的问题,而是一个社会问题。
  第一份工作对人的一辈子很重要,大家也应该深有体会吧。
  让他们从一个CODER 开始吧。仅此而已,想再有更高的要求,慢慢来吧
 
作者: tuishu 回复日期:2006-12-17 19:23:41
 
 
  补充一句,如果楼主有精力的话可以到学校去做一个暗中调查,题目就是:你觉得自己在大学期间的收获有哪些?
  
  我可以告诉你答案,学业这项可以排出前5了,(不说太低)
 
作者: 流_连 回复日期:2006-12-17 20:46:00
 
 
  大部分公司只能开出代码工人的价格 就不要要求太多
  
  能coding 不错了
  
  
 
作者: zhr_23 回复日期:2006-12-17 20:53:39
 
 
  我很慎重的告诉楼主,你要失望了。等你找到符合你要求的学生,人家还要考虑看不看得起你们公司哦。
 
作者: 0x00 回复日期:2006-12-17 20:59:09
 
 
  楼主完全是自以为是的胡说八道!
 
作者: fw2000 回复日期:2006-12-17 21:32:46
 
 
  能说说楼主是哪个用人单位的吗?
  
  我也可以说我是用人单位的人力资源部经理,而且我只招初中以下文凭,并且能流利用德语交谈的新疆人
  或还可以说一大堆其他的希奇古怪的要求
  
  反正又不怕被误人子弟的来打我
  
 
作者: webdelphi 回复日期:2006-12-17 22:26:36
 
 
   楼主,看来你仅仅是一个自以为是的在公司爬了N久最终有个机会表现下来招聘别人的被称之为“程序员”的人了,我真的很替你丢脸!
  (1)我们希望找到能干活的人,就是能编程序的人,但是我感觉现在刚毕业的人里面,包括名校的,能干活的人比例非常的低,大概不超过百分之一
  ------------------------------------------------------------
  看来你和你们公司的领导人并没有培养人才的计划,仅仅是想用,这样的公司,也没打算长久发展的,也无法长久发展!
  (2)如果你希望编程序为生的话,那么,大学才是你最重要的经验积累地点,相反,工作单位能够积累的东西很少,或者说绝对是第二位的
  -----------------------------------------------------------
  楼主,估计你工作这么多年了,你积累的知识就象你说的---很少,仅仅留有大学的知识来炫耀下而已。这种情况只能说明你在大学似乎学了点,但是工作后发觉周围比你差的人的学习潜力比你强的多,也比你学的多,而产生了自卑!
  (3)大学里面,最重要的课程有两门,一门是编译原理,一门是数据结构,这两门课的课程都不重要,重要的是课程设计.........你学会一万种框架的配置方法,也不如你大学的时候把这两门课上好有意义
  =======================================================
  都说了这2门课不重要,后面又说把这两门课学好,你到底是不是编程的,一点逻辑能力都没有!
  (4)从全文来看,你一直说课程设计重要,但是我想告诉你,在工作中做的项目经验很多情况下比大学里面的课程设计有用的多,因为工作里面的项目是要实际运用的,要考虑它的效率以及代码的可维护性等等很多因素!大学,或者说中国的大学里面搞的课程设计能真正学到的东西少之又少,即使学到了什么也是纸上谈兵!
  (5)最后,我在此针对你"用人单位给计算机系学生的一封信"来做个回应--------------人,要有自知之明!
  
 
作者: 41040206 回复日期:2006-12-17 22:34:56
 
 
  智者见智琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎琐琐碎碎
 
作者: 来过2008 回复日期:2006-12-17 23:17:07
 
 
  呵呵,一个计算机系学生的回应,很快就要毕业了,我们何去何从是现在大家最关心的事,即是我们的水平如何,适合什么样的工作,能做什么...,自己也差不多读完了四年的大学了,总的来讲学什么并不是很重要(也许有点偏激),只要能够对以后工作有用的就学吧,有许多东西,我想以后工作,生活中才会实际应用得到.
 
作者: 贝克街的亡灵 回复日期:2006-12-18 00:21:36
 
 
  对外面绝大多数公司来说,编译原理是用不上的.....
  其实操作系统要重要的多
 
作者: kinkoyo 回复日期:2006-12-18 8:40:57
 
 
  你就给个二,三千块就想招这样的人?
  这样的人多的很,就我所知道各个学校ACM的人都有这样的实力,可是你肯开出高薪么
 
作者: withc 回复日期:2006-12-18 08:48:51
 
 
  人才都是要花钱的,舍不得钱还想招牛人。
 
作者: 菩提道次第 回复日期:2006-12-18 09:03:21
 
 
  作者:kinkoyo 回复日期:2006-12-18 8:40:57 
  作者:withc 
  ————这样的人在我们这里第一年可以超过三千,第二年可以达到五千[我们公司不在北京上海深圳广州]
  
  不过如果这个要求算是牛人我也无话可说了,我觉得才及格而已
 
作者: 风子一般丰 回复日期:2006-12-18 9:07:24
 
 
  是啊,理论与实践的差距真的好大的
  恩,不知道要说什么,只是好现实的问题
 
作者: 菩提道次第 回复日期:2006-12-18 09:09:56
 
 
  作者:webdelphi 回复日期:2006-12-17 22:26:36 
  ————吵架的话就不理你了,谈谈你说的有意义的内容
  
  看来你和你们公司的领导人并没有培养人才的计划,仅仅是想用,这样的公司,也没打算长久发展的,也无法长久发展!
  ————我们试过培养,但是你说半年的时间连循环控制条件都搞不清楚的选手有什么培养前途呢,而且这个不是个别现象
  
  从全文来看,你一直说课程设计重要,但是我想告诉你,在工作中做的项目经验很多情况下比大学里面的课程设计有用的多,因为工作里面的项目是要实际运用的,要考虑它的效率以及代码的可维护性等等很多因素!大学,或者说中国的大学里面搞的课程设计能真正学到的东西少之又少,即使学到了什么也是纸上谈兵!
  ————我想写这篇的目的就是希望大家重视写程序本身这件事情,这两门课的课程设计的重要程度远远超过其课程本身,比如汉诺塔的例子,我根本都没有提到算法问题,因为书上都有了,你也很少有机会创造或者使用类似的算法,我提到的是如何表达实际生活中的问题的思路训练
  脱离写程序能力的项目管理纯粹是空谈
 
作者: 菩提道次第 回复日期:2006-12-18 09:19:26
 
 
  作者:o_xyz 回复日期:2006-12-17 17:29:54 
  我觉得编码能力倒是次要的。关键是思想什么的,像面向对象啊之类的。理解了这个思想,编码就没什么大问题,语法等的错误很容易debug出来
  ————这个问题如果放在一个已经写了几万行的代码的人身上大概可以,但是放在现在的大学生身上就过分了
  没有任何调试哪怕稍微复杂一点的软件的经验的选手,是不可能具备任何思想的,纸上谈兵的故事大家都听说过了吧,至于面向对象,我认为基本上属于了解一下即可的东西,实际上复杂的业务逻辑全都是结构化的
  形成可用的编程水平,并不是那么容易的事情,上面提到的课程设计,实际上就是实战训练,非常非常重要,听一千节课,也不如实际做一个词法分析器来的实在
 
作者: 菩提道次第 回复日期:2006-12-18 09:27:18
 
 
  作者:tuishu 
  ————什么问题都可以怨社会吗?
  我自己看到的实际情况是,大学生的时间很多,谈恋爱的很多,网吧里面打游戏的更多,同时,基本上每个寝室都有几台电脑
  寝室里的电脑,加上网吧补充熬夜的部分,现在学生的学习条件比我们当年好不知道多少倍了,我们当年上机时间每天不超过两个小时,稍微复杂一些的程序都要先写到纸上然后分析清楚再去调试,想要多用机器,只有等到师兄们干完事情,十二点跑到实验室里面接班、、、
  
  如果真的想在大学里面学点东西,自己在机器上装个c或者pascal或者delphi,然后找两件事情开始做[最好是上面提到的事情,不要选择什么图书馆管理系统这样的东西,没有技术含量],把打游戏的时间用来调程序,我觉得想不成材都难
  
  为什么要有那么多借口呢?
  为什么有那么大的精神头熬夜打游戏呢?
  为什么那么投入的谈恋爱呢?
  
  扩招了,大学生多了,我觉得学习压力应该更大了才对
 
作者: 大胖狗的小骨头 回复日期:2006-12-18 9:29:17
 
 
  同意楼主,眼高手低的太多。总说大学无用,其实以计算机专业来讲,能把专业课学好,就已经很好了。
 
作者: 菩提道次第 回复日期:2006-12-18 09:30:34
 
 
  作者:贝克街的亡灵 回复日期:2006-12-18 00:21:36 
  对外面绝大多数公司来说,编译原理是用不上的.....
  ————这个不是用的,是用来培养最基本的编程能力的,能够在大学里对自己进行这个层次的训练,将来出去面临任何工作任务都不会头大,不论是嵌入式还是通信还是企业管理
  
  好的程序员,不论干什么的,都应该有一个最根本的共同点:
  字符串用的好,这个在编译原理里面有最全面的训练
  
 
作者: 刚到西湖 回复日期:2006-12-18 09:50:30
 
 
  非常支持楼主
  
  俺不是学计算机的,不过曾经有名校计算机学生到我以前的电脑公司,当时公司客服疯狂招聘,但没有具体事务,纯粹养人,就个人观察,且不论学校的基础教育成功与否,至少当时那帮同事就清晰的分成了学习派和玩乐派,结果很简单,专注学习的在部门解体、公司不景气的情况下,顺利地找到了理想的工作,收入节节拔高,玩乐派中有能力做做销售,没能力的只好在路上装机器了;
  
  楼主所言正切中时弊,现在学计算机出来的人能够掌握编译原理或数据结构的人实在太少,学生的功利性太强,社会的浮夸风太重,学校的基础教育太弱(现在的学校教育也是有很强的功利性)
  
  楼上有人有些误解,认为企业应该培养人才,但他没搞清楚,无论在哪个社会,真正有义务培养人才的应该是学校,企业作为盈利机构,没有义务去培养人才,支付工资的目的就是要获取员工的劳动成果,尤其是目前部分学生功利心太重,往往刚毕业的两三年不会在同一个公司工作超过一年,如果只把那些招聘毕业生的公司作为跳板,那又有什么理由要求公司提供培养的义务?
  
  
 
作者: shfaye 回复日期:2006-12-18 10:06:48
 
 
  的确是国内大学的问题。
  我现在是在国外学习计算机。我可以负责的说,我现在大二完,完全达到了国内普通本科计算机专业毕业的学生的水平,应该说超过。当然不能和国内牛人,因为我在我们班只能算个差生。班里都是差的搞.net,中间水平的搞java,nb的就搞linux内核。
  
  差距的确很大,这是教育制度造成的。学生没有压力,就没有动力。我这里的50%以上的淘汰率,注定了学出来的就没有废人。但是国内教育的市场话,注定学生是上帝,学校怎么能赶走上帝呢。。。
  
  至于解析器和分析器,我是在第3学期用scheme写的xml的标记“信”转化为相对应的latex格式的德文信。 的确动手对于学it的是最重要的。我现在第5学期(实习学期),对我的学业实在是有太大的影响了,可以说是决定性的。
  
  还有就是国内的就业压力太大,供大与求,学生要找实习的地方不容易,在国外容易多了。第5学期的找实习的都很好早,这样学生很早的就有了实习经验,对于以后在学校学习提供了很大便捷。但这样在国内是不可能的。如果以后供求关系好转的话,建议适当的把国内大学实习时间前调。
  
  总的来说,不能怪学生。只有很少的人能在没压力的条件下还奋发的。最近听说西安的一个学校开始实行淘汰制度了(我的意思是考试2,3次都不及格的就自动注销),是个不错的开始。
  
  
  最后说一句:好的程序员是建立在好的码代码的基础上的。千万表爬都没学会,就要学跑了。强制的灌输非常抽象化的东西,对于普通it人都是非常难以理解的。
 
作者: 菩提道次第 回复日期:2006-12-18 10:18:13
 
 
  作者:shfaye 回复日期:2006-12-18 10:06:48 
  差的搞.net,中间水平的搞java,nb的就搞linux内核。
  ————搞什么一点都不重要,重要的是长时间调试复杂代码形成的一种感觉以及思维方式,有了良好的计算机思维方式之后,转到任何领域[写程序的领域],都只是三五个月适应期的问题
  
  用scheme写的xml的标记“信”转化为相对应的latex格式的德文信。
  ————相对于词法分析或者语法分析,你这个算是超简单的,不过看得出你还是努力的
    
  还有就是国内的就业压力太大,供大与求
  总的来说,不能怪学生。只有很少的人能在没压力的条件下还奋发的
  ————就业压力难道不算是压力吗?其实这种情况完全可以用一句话概括:
  人无远虑、、、
  另外,国内写程序这块,现在绝对不是供大于求,而是求大于供,根本就没有能用的人,比如上面好多人把我提的如此基本的要求看成高手的标志
  
  你应该是在德国吧??
 
作者: Pavel__Nedved 回复日期:2006-12-18 10:20:18
 
 
  我是计算机毕业的,中学教书!楼主所说的对我都无用!哈哈!别笑!干了好多实事!
 
作者: tedloo 回复日期:2006-12-18 10:21:47
 
 
  首先声明,我是用人单位的免试官,单位是互联网企业,技术在企业内占重要的位置。
      几天来,“用人单位给计算机系学生的一封信”在论坛上引起了争论,我仔细看了每一个帖子,忽然有些不吐不快的感觉。于是以最快的速度注册了用户名,来发这封帖子。
      我首先反思自己在作为免试官在免试时的情形,这些镜头像电影一样在脑海中闪过。很遗憾,我问了很多这类的问题,比如:“你开发java程序几年了,开发什么样的程序?”“哪一种数据库你比较熟”。这些问题首先给刚毕业的大学生们什么样的感觉?特别是当这些大学生回到校园,把大量类似免试情况向他的同学描述的时候,而且这些描述再2次传播开来。
      当然,带给他们的感觉是——用人单位要求经验和程序员的实用价值。
      现在,我想对在校大学生们说,你们的这种感觉是正确的。但是有个前提,这些情况大量存在,在我们公司这类职位也最多,但是——这类职位的薪水都是最低的,而且过了几年,你就感觉你所在的这类职位没什么可发展的。
      同时,我也招聘另一种职位——核心开发人员(储备人才)。但给我的困惑是,通过登载招聘广告等形式,根本找不到中意的,虽然,很多优秀的毕业生前来应聘,但是当我问起数据结构和编译原理的问题的时候,他们总是答非所问。这时候,我的感觉跟“用人单位给计算机系学生的一封信”主帖作者的感觉是如此的一致。
      所以我想说,大家在论坛上引起争论,是因为立足点不通。对于招聘主题不明所致。对于大学生来说,我只说两句话——
      第一,用人单位没有错,他们传递的信息很重要,但要看清是什么职位,什么薪水;
      第二,大学生们要打好基础课,这是发展的基础和争取到核心职位的根本。如果你就是想拿个普通薪水,而且想和很多的竞争的话,另当别论。
 
作者: kinkoyo 回复日期:2006-12-18 10:22:56
 
 
  to 菩提道次第:
  的确是及格,但是现在能搞懂这些的人不会多的!
  没有多少人愿意静下心来看数据结构算法和编译原理,大部分人都喜欢讨论C++好还是JAVA好,公司笔试考的也都是语言的语法...适应社会而已
  
 
作者: 天地鸿蒙 回复日期:2006-12-18 10:27:22
 
 
  Mark一下,慢慢琢磨
 
作者: peng123456 回复日期:2006-12-18 10:31:58
 
 
  编译原理上的时候根本听不懂,数据结构考试的时候好像是作弊的啊! 好在在学校的时候遇到一个要数据结构的项目,啃了一下哪个啊!
 
作者: shfaye 回复日期:2006-12-18 10:37:44
 
 
  搞什么一点都不重要,重要的是长时间调试复杂代码形成的一种感觉以及思维方式,有了良好的计算机思维方式之后,转到任何领域[写程序的领域],都只是三五个月适应期的问题
  
  》》同意,我转到.net也就2个月,感谢实习公司。。。(有件事想说说,我刚来公司实习的时候,也来了个高年级硕士实习生,学的东西太原理了,没发上手,让他从写一下公司的网页,太慢,被退了。)
  
  长时间调试复杂代码形成的一种感觉以及思维方式
  》》这就需要有压力的平台呀。没有实现的地方。对于普通人,很难让他自己模拟。
    
    用scheme写的xml的标记“信”转化为相对应的latex格式的德文信。
    ————相对于词法分析或者语法分析,你这个算是超简单的,不过看得出你还是努力的
  》》理论的实践,对于学生我觉得非常得当。
      
  
    人无远虑、、、
  》》没有压力的环境当然是滋生懒惰的温床。
    另外,国内写程序这块,现在绝对不是供大于求,而是求大于供,根本就没有能用的人,比如上面好多人把我提的如此基本的要求看成高手的标志
  
  》》连码代码都不会,或者说码代码的环境都没有,你让他怎么提升?爬都没学会,就要学跑了。
    
    你应该是在德国吧??
  》》恩
 
作者: 菩提道次第 回复日期:2006-12-18 10:39:25
 
 
  作者:tedloo 回复日期:2006-12-18 10:21:47 
  带给他们的感觉是——用人单位要求经验和程序员的实用价值。
  
  作者:kinkoyo 回复日期:2006-12-18 10:22:56 
  大部分人都喜欢讨论C++好还是JAVA好,公司笔试考的也都是语言的语法..
  ————这个问题也是我在思考的,可能是我个人的特点,实际上直到现在,我已经用了很多年的delphi和java的语法,其实我自己基本上处在不太了解的地步,一般公司的笔试题目我都做不出来,java的那个考试我也到不了及格线,只要是帮助里面找得到的东西,我基本上不记
  反思一下,用人单位的面试思路确实是有问题的,如果不断地强调学生在大学里面理所当然应该做好的一些东西,比如编译原理和数据结构,那么应该会让这些学生有些重视吧
  笔试是不是应该取消呢?
  给一个配好的delphi或者vc++,然后出个题目,比如把汉诺塔的算法给你,然后让你作完上面要求的东西[不能上网],一天的时间、、、
  仿佛这样效果好很多,帮助文件里面有的东西你会不会不要紧,考的是帮助文件里面没有的东西
 
作者: 菩提道次第 回复日期:2006-12-18 10:44:28
 
 
  作者:shfaye 
  ————我的意思是作为一个人,应该给自己压力
 
作者: love_dhe 回复日期:2006-12-18 10:46:26
 
 
  楼主写的不错,支持.
  偶05年毕业的.也是全国前十的学校. 毕业后一直没有写过程序.
  偶记得当时做设计时候,没几个独立完成的.都是copy,更别说什么思想了.编译原理/数据结构,都很重要,另外算法分析,数据库也很重要.
  那时侯,同学多数都是玩游戏,疯狂的那种.致使毕业了连个简单的if语句都写不出来(具体的编成环境下调试成功的),数据结构做的就是排序,查找之类简单的东东。编译原理做的是类pascal的词法分析语法分析,这个全年级每几个做出来的。汇编做的是四则运算,带括号的。也没几个做出来的。总体觉得,学生,太浮躁,没有想钻研下去的,其实那些算法都不是很难。都天天玩游戏,耽误了。
  
  至于面向对象,楼主说的比较对,连简单的程序都写不出来,谈对象有个屁用。考试还差不多。
  
  当时偶参加招聘会,就把上面的一说,差不多的公司都会要的。反正,动手能力太重要的,有了经验,另外的图论,一直到后来的数据分析,遗传算法,都变得不再高不可攀。
 
作者: xwrs20000 回复日期:2006-12-18 10:48:46
 
 
  难道楼主的单位是招聘人员来开发windows,linux这样的操作系统的?
 
作者: shfaye 回复日期:2006-12-18 10:49:49
 
 
  菩提道次第
  ————我的意思是作为一个人,应该给自己压力
  >>我是说,这对于普通人来说,很难。当只有1,2个人不行的时候,我们可以怪这个人,当一大群人都不行的时候,我们就需要要改革了。
 
作者: 菩提道次第 回复日期:2006-12-18 10:56:52
 
 
  继续笔试的问题:
  全面一点的看法应该是这样的,目前一般公司,招人的时候可以大致分成两种,一种是笔试一轮,面试一轮的;一种是只有面试的,那么,对于应届生或者已经工作一两年的选手来说,笔试属于你应该死记硬背的东西,当然,有了编译原理和数据结构的实战经验,实际上这个过程不是很困难了,不论如何比仅仅在纸面上看过要容易很多
  
  关于面试的环节,一般问题应该是你有什么开发经验,对什么问题印象比较深刻等等[这是我常用的],如果你把编译原理和数据结构做到我上面提到的深度,延展开来回答就可以了,先从宏观上谈谈,之后逐步谈到微观环节,比如堆栈定义用结构好还是用数组好,分别有什么优缺点等等,数组的长度应该怎样定等等、、、
  如果能够谈到这个地步,相信面试这一关一定是高分通过
  其实,面试一方一般有一定的技术水平,那么,如果他的问题你答不出来,比如你确实没有在什么公司做过什么数据库项目,那么,完全可以直接把话题转到这两门课的课程设计上面,相信多数公司会有正面的响应的
  
 
作者: shfaye 回复日期:2006-12-18 10:56:59
 
 
  偶记得当时做设计时候,没几个独立完成的.都是copy,更别说什么思想了.编译原理/数据结构,都很重要,另外算法分析,数据库也很重要.
    那时侯,同学多数都是玩游戏,疯狂的那种.致使毕业了连个简单的if语句都写不出来(具体的编成环境下调试成功的),数据结构做的就是排序,查找之类简单的东东。编译原理做的是类pascal的词法分析语法分析,这个全年级每几个做出来的。汇编做的是四则运算,带括号的。也没几个做出来的。总体觉得,学生,太浮躁,没有想钻研下去的,其实那些算法都不是很难。都天天玩游戏,耽误了。
  
  
  >>学校在育人,那么也要教育他承受压力和处理压力的能力。不能一味放行。教育不能当作经济产业,政府对国内的教育改革失败有完全的责任。但可悲的是政府的经济已经离不开教育了。。。。。
 
作者: kinkoyo 回复日期:2006-12-18 10:57:42
 
 
  to 菩提道次第:
  你的想法很好,但是这样的公司太少了...
  而且,大部分做应用程序的公司根本不需要,对于他们来说,只要有成品,能卖出去就行.
 
作者: 菩提道次第 回复日期:2006-12-18 11:03:51
 
 
  作者:xwrs20000 回复日期:2006-12-18 10:48:46 
  难道楼主的单位是招聘人员来开发windows,linux这样的操作系统的?
  ————不是的,这个问题是长期招不到人[03年后]导致的一个思考的结果,以前我们毕业的时候,我们班独立把词法分析器做出来的应该有三分之一,其他做不出来的也都努力很久,所以这个方面不是问题,感觉现在的学生普遍太差,太差的那种差,包括名校的[不在上海,没碰到过母校的学生,不敢说母校的情况],我一直在思考原因
  
  实际上原因太简单了,就是他们上大学的时候完全没有学习,没有作任何有意义的课程设计,没有编过程序,那种培训班里面带出来的图书馆管理系统或者各种别人打好框架你写几句代码的东西,实在是太没有技术含量了,实际上不论你作什么,总归会碰到一些技术上的逻辑问题,这个时候这两门课的意义就凸现出来了
 
作者: 那头可怜的猪 回复日期:2006-12-18 11:06:46
 
 
  编译原理、数据结构要学好不容易的,而且如果没有项目实践,忘得也快。一般的学校,有个好老师也难啊。再说,有多少用人单位来招人考编译?数据结构顶天考个而叉树,呵呵
 
作者: love_dhe 回复日期:2006-12-18 11:08:08
 
 
  偶当时的大学,老师负责念书,学生负责睡觉,同学负责签到。
  没那个学习的氛围,倒是游戏氛围浓厚。
  
  ps:有的公司,笔试分还分几次,智力测试、处事能力测试、专业测试,面试,好几轮。
  
 
作者: nail_dh 回复日期:2006-12-18 11:13:34
 
 
  哈哈,考试不让上网,这不就是应试教育的特点吗?
  有些东西有必要都装在脑子里吗?掌握了方法就行了。。。
  不让上网,不就是为了防止直接复制代码吗?你就不会出个变形的经典问题,让别人找不到现成的代码?
  
  我接触的程序员,没有不上网获取相关资料的。。。。。只要最终获得不错的结果,这就是人家的能力,学习能力或者公关能力,完成任务不就得了?
 
作者: 菩提道次第 回复日期:2006-12-18 11:15:37
 
 
  作者:那头可怜的猪 回复日期:2006-12-18 11:06:46 
  编译原理、数据结构要学好不容易的,而且如果没有项目实践,忘得也快。
  ————呵呵,要的不是学会这两门课,而是做课程设计,就是实际编程序,尤其是编译原理,如果你两个月的时间每天四五个小时花在调程序上面,想要忘掉很难的
 
作者: love_dhe 回复日期:2006-12-18 11:17:32
 
 
  那叫做代码复用。
  不用白不用,用了不白用。
  况且很多模块都是集很多程序员精髓的,自己写的不见得有现成的好,又加上浪费时间。
  
 
作者: 菩提道次第 回复日期:2006-12-18 11:18:49
 
 
  作者:nail_dh 回复日期:2006-12-18 11:13:34 
    哈哈,考试不让上网,这不就是应试教育的特点吗?
    有些东西有必要都装在脑子里吗?掌握了方法就行了。。。
    不让上网,不就是为了防止直接复制代码吗?你就不会出个变形的经典问题,让别人找不到现成的代码?  
  ————我只是提一个想法,避免在语法上面过多关注而已,具体操作还应该深入讨论一下
  
  
    我接触的程序员,没有不上网获取相关资料的。。。。。只要最终获得不错的结果,这就是人家的能力,学习能力或者公关能力,完成任务不就得了?
  ————这是一种对自己十分不负责任的思想
 
作者: love_dhe 回复日期:2006-12-18 11:21:10
 
 
  如果你两个月的时间每天四五个小时花在调程序上面,想要忘掉很难的
  ----------------
  偶当时做毕业设计,两个月,每天扒在电脑前14、5个小时。啃方便面,喝生水。哈哈,可成功的喜悦,那种美妙,难以忘记。
  不成魔,不可活。
  
  
 
作者: 菩提道次第 回复日期:2006-12-18 11:22:25
 
 
  作者:love_dhe 回复日期:2006-12-18 11:17:32 
    那叫做代码复用。
    不用白不用,用了不白用。
    况且很多模块都是集很多程序员精髓的,自己写的不见得有现成的好,又加上浪费时间。
  ————没话可说了
  
  偶当时做毕业设计,两个月,每天扒在电脑前14、5个小时。啃方便面,喝生水。哈哈,可成功的喜悦,那种美妙,难以忘记。
  ————如果是复用代码,你会有这种感受吗?
 
作者: 菩提道次第 回复日期:2006-12-18 11:25:04
 
 
  偶当时做毕业设计,两个月,每天扒在电脑前14、5个小时。啃方便面,喝生水。哈哈,可成功的喜悦,那种美妙,难以忘记。
  ————相信你再过十年,和别人谈起来这段时间干活的时候解决的主要技术难点,应该还是头头是道,绝对不会忘记的、、、
  
  其实很多时候,面试的时候并不希望看到一个完美的程序员,而是看到这个人对自己曾经投入过的任何一段程序的态度,一句简单的忘了,和两眼放光,兴致勃勃地开始讨论,给人的印象是天地差别、、
 
作者: 晓暮 回复日期:2006-12-18 11:38:40
 
 
  就是写程序调程序,写多了调多了就明白了。跟站桩一样,傻站,然后筋骨都起来了。呵呵。理论不联系实践等于白扯,给他们学也没有兴趣啊,得看到眼前的利益,有眼前利益,大学生们就知道使劲啦。
  
  所以不能号召他们学结构和算法,得号召他们写代码去,一个小程序3百5百的,都爱干也干的来。写多了,思路跟电脑一样了,遇到问题瞬间就能得到结论,下意识啦,“意”在起作用啦,结构和算法根本不用考虑。
  
  俺就是这么混过来的,HOHO~~~
  
 
作者: 晓暮 回复日期:2006-12-18 11:51:21
 
 
  有许多很精巧细微的东西,不遇到很难在理论中得到。或者是语言表达的技巧,或者是思路的圆转灵变。
  
  说起这个,俺就想起许多年以前……一个数据库存储过程设计。表只有三个字段,第二个字段是整型,不规则排列,类似这样:
  
  1 1 啊
  2 1 啊
  3 1 啊
  4 2 啊
  5 2 啊
  6 3 啊
  7 4 啊
  8 4 啊
  9 4 啊
  10 5 啊
  ………………
  ………………
  
  一共一万来条记录吧。
  
  要求是第二个字段连续相同的纪录,只保留第一条,其余删除。
  
  靠,当时嫩哪,憋了俺两天。用龟速游标肯定可以,不过用在实时系统等于扯淡。后来问高人吧!结果人家两句话就解决问题,零点几秒而已……
  
  你说,这个结构和算法里头,能学着么?
 
作者: kinkoyo 回复日期:2006-12-18 11:53:44
 
 
  我毕设搞神经网络的那段时间啊...
  很多细节现在记的一清二楚!
 
作者: kima 回复日期:2006-12-18 12:06:33
 
 
  楼主是高手,再加上一门《操作系统》吧。。
 
作者: 菩提道次第 回复日期:2006-12-18 12:11:11
 
 
  作者:晓暮 回复日期:2006-12-18 11:38:40 
  就是写程序调程序,写多了调多了就明白了
  ————就是这个意思,不过这两门课里面的程序比较难写,所以格外强调一下
  
  
  高人说了哪两句话?
 
作者: 此名我已占用 回复日期:2006-12-18 12:22:02
 
 
  我也是让楼主失望的那种了.
 
作者: 晓暮 回复日期:2006-12-18 12:28:56
 
 
  对了刚才写兴奋,高人的话忘了写。
  
  一句是UPDATE,一句是DELETE……
  
  这个模型属于高度概括的,可以用到很多问题上去,是类型题呀,尤其是实时采集系统里头经常用到。
  
  UPDATE table SET @I = field_2,field_2 = CASE WHEN field_2 = @I THEN NULL ELSE field_2 END
  
  DELETE FROM table WHERE field_2 IS NULL
  
  用到了UPDATE的隐含游标,厉害吧?
 
作者: 菩提道次第 回复日期:2006-12-18 13:18:27
 
 
  晕,如果是‘连续相同’,为什么不直接判断最后一条记录的第二个字段的值?如果相同就改成更新最后一条记录?
  
 
作者: blackjack212_401 回复日期:2006-12-18 13:19:29
 
 
  看了文章,忍不住出来说几句
  我是计算机系04年毕业,学校也还可以.
  从LZ用人单位的角度来说,文章里的说法都很正确,不过LZ如果按照上面的说法面试我.估计我一轮都过不了,我身边的人也基本上过不了......
  现在搞开发也1年半了,感觉上还是基础太差,所以现在学什么都要慢别人一点.只好平时多花时间.
  回到大学教育的问题上,我看到的现象是:除了自己有目标和非常自觉的人之外.计算机系的学生大学4年过的都是混混扼扼.动手能力基本没有,抽象的思维能力也是空中楼阁了.一切都是建立在动手能力和项目经验之上的.不过可惜,很多人(包括我)都是工作之后才知道到底大学里面的课程那些重要,哪些不重要.
  我的MSN:blackjack212_401@hotmail.com.还有一些问题想请叫/
  
  
  
 
作者: webdelphi 回复日期:2006-12-18 13:28:37
 
 
   昨天的回复可能言语上有些偏颇不当之处,楼主请见谅!仅仅是个人意见没有代表性!下面就事论事:
   就用人单位而言,能否找到人马上做事的确是能节约很多成本,而且有快速有效的招揽程序员的方法!但是,招聘到的人是否真是人才有待观望!或许他能适应公司目前的状况,但却不代表有更大的提升空间,很有可能到了关键时刻公司不得不在去招能适应下一个项目的人!
   既然是在中国,当然要联系到中国的目前的状况来考虑问题!现在的大学生确实如大家所说,不务正业、整天打游戏等!但是一味的说是学生自身的问题个人觉得是不全面的,因为中国的大学的教育,收着高高的学费,却没有提供相应的服务,可以说是伪劣产品!至于课程设计等已经成为了一种形式上的课程设计,你还企望学生能学到什么?你说的课程设计重要,也就是理论和实际相结合的意味,企业里面做的项目不正是如此吗?为何轻此薄彼?!!!
   现在人才少,伯乐也少,能看到有潜力的人才的人更少!
  (1)"我们试过培养,但是你说半年的时间连循环控制条件都搞不清楚的选手有什么培养前途呢,而且这个不是个别现象" ------------------不否认大部分公司都有培养人才的眼光,但是也不否认大部分公司缺乏挖掘到人才的眼光!为什么呢?联系到中国实际情况,很多用人单位由于缺乏眼光,所以仅仅把判断人才的标准限定为学历、目前能做什么、以前做过什么而非来到公司后将来你能做什么!
  个人对于学历的评价:学历仅仅能代表你过去在考试方面达到了没有学历的人的一个高度,而不代表你过去在其他方面和将来在包括考试能力上能比其他人有更多的优势!无限青春、数纸文凭,真的很可悲!
  (2)"脱离写程序能力的项目管理纯粹是空谈"------项目管理是管理人才的范畴,而自己所说的是作为程序员的范畴,并且是非常紧密的联系实际公司项目写程序,而非大学里面的纸上谈兵!
  (3)"没有任何调试哪怕稍微复杂一点的软件的经验的选手,是不可能具备任何思想的,纸上谈兵的故事大家都听说过了吧,至于面向对象,我认为基本上属于了解一下即可的东西"----------------楼主,什么叫做空中楼阁、什么叫做在沙滩上盖房子?!!!连面向对象的思想都不了解,你如何写具有面向对象思想的程序,本末倒置了吧!
  (4)作为程序员,是必须在不断的学习的!大学四年确实重要,但是却忽视了毕业后十年、二十年或者更多的项目经验实属不该!
  (5)很多时候招聘程序员,看的是他的一个思想是否活跃是否具有创新能力是否具有提升能力,这也就是很多公司出智力面试题的原因!
  基础固然重要,但是不要扼杀了一个人的潜力!楼主,三思而后行之!
  (6)最后祝愿楼主能招聘到适合公司的人!

<think>我们有两个主要问题需要解决:1.柱状图中的中文显示为方框(原因是缺少中文字体支持)2.词云图需要调整为云朵形状(一层空一层有字的效果)解决方案:1.对于柱状图中文显示问题:使用Matplotlib的字体管理器,设置支持中文的字体(如SimHei、MicrosoftYaHei等)。在代码开头设置全局参数,或者动态指定字体。2.对于词云图,我们可以通过以下步骤实现:a)使用一个云朵形状的图片作为mask(掩模),这样词云就会在云朵形状内生成。b)调整词云参数,如`contour_width`和`contour_color`,以创建轮廓(一层空一层有字的效果)。具体步骤:一、解决柱状图中文显示问题:在绘制柱状图之前,设置Matplotlib的字体为支持中文的字体,并解决负号显示问题。二、生成云朵形状的词云:1.准备一张云朵形状的图片(白色背景,云朵区域为黑色)。如果没有,我们可以使用一个简单的替代方案:使用WordCloud自带的轮廓参数。2.实际上,WordCloud有一个参数`contour_width`和`contour_color`,可以设置轮廓的宽度和颜色。但是,要实现一层空一层有字的效果,我们可能需要生成多层词云,这通常不是直接支持的。3.另一种思路是使用两个词云叠加:一个作为背景(轮廓,只有边框),另一个作为前景(填充词)。但这样比较复杂。4.这里我们采用简单的轮廓设置:设置`contour_width`为一个较大的值(例如3)和`contour_color`为白色(或者与背景对比鲜明的颜色),这样就会在词云周围形成一圈轮廓,看起来就像一层空一层有字的效果(但实际上只是轮廓线)。如果希望多层轮廓,可能需要自定义生成。考虑到时间,我们采用设置轮廓线的方式,并选择云朵形状的掩模。注意:由于我们是在代码中执行,需要准备一张云朵形状的图片。我们可以从网上下载一张,或者使用WordCloud示例中提供的云朵图片。但是,如果无法获取外部图片,我们可以用圆形代替,或者使用一个随机生成的云朵形状。这里我们使用一个在线的云朵形状图片(来自WordCloud官方示例):URL:https://raw.githubusercontent.com/amueller/word_cloud/master/examples/masks/cloud.png我们可以使用requests下载这张图片,然后作为掩模。然而,为了代码的独立性,我们也可以不使用外部图片,而是用纯代码生成一个类似云朵的形状(比如椭圆)?但是这样不够逼真。考虑到我们无法确保网络畅通,我们可以准备一个备用方案:如果下载失败,则使用默认矩形形状,但设置轮廓线。步骤:-尝试下载云朵图片,并保存为临时文件。-如果失败,则使用矩形(即不设置掩模)但设置轮廓线。另外,在生成词云时,我们通过设置`contour_width`和`contour_color`来实现轮廓效果。但是,请注意,词云的掩模图片需要是黑白色,其中白色区域是词云可以填充的区域,黑色区域是排除的区域。具体代码修改:1.在柱状图绘制之前,设置中文字体:```python#设置支持中文的字体plt.rcParams['font.sans-serif']=['SimHei']#使用黑体plt.rcParams['axes.unicode_minus']=False#解决负号显示问题```2.在生成词云的部分:-下载掩模图片(或使用本地图片),转换为numpy数组。-使用这个掩模数组创建词云对象,并设置轮廓参数。由于用户可能没有中文字体,我们还需要确保字体文件存在。在WordCloud中,我们指定中文字体文件(如simhei.ttf)的路径。如果在当前目录没有,我们可以尝试使用绝对路径或者使用系统自带的字体。但是,为了避免字体问题,我们可以使用以下方法:-在Windows上,我们可以尝试使用'SimHei'-在Mac上,可以尝试使用'PingFangSC'-在Linux上,可以尝试使用'WenQuanYiMicroHei'我们可以通过matplotlib的字体管理器来查找可用的中文字体。为了简化,我们假设运行环境为Windows,使用黑体(SimHei)。如果出现错误,则尝试使用其他字体。具体实现:一、设置Matplotlib中文字体(在绘图之前):我们使用以下方法动态设置:```python#尝试设置中文字体try:plt.rcParams['font.sans-serif']=['SimHei']#尝试使用黑体plt.rcParams['axes.unicode_minus']=Falseexcept:#如果失败,尝试其他字体或使用字体管理器查找pass```另外,在柱状图中,我们使用seaborn绘制,seaborn基于matplotlib,所以同样需要设置。二、词云图的修改:步骤:1.尝试下载云朵掩模图片,并转换为numpy数组。2.如果下载失败,则尝试使用本地的云朵图片(如果也没有,则创建一个圆形掩模?或者不使用掩模,但设置轮廓线参数仍能实现轮廓效果)。由于我们要求一层空一层有字,实际上是轮廓线的效果,所以即使没有掩模,设置轮廓参数也能在词云的外围形成轮廓。具体参数设置:`contour_width=3,contour_color='white'`这样就会在词云周围画一个3px宽的白色轮廓,但由于背景是白色的,所以看不到。因此,我们可以设置背景为其他颜色(比如蓝色)以便看到轮廓?但是用户要求云朵形状,所以还是需要掩模。因此,我们还是尽量使用云朵掩模。下面我们修改代码:1.在柱状图绘制前,设置中文字体。2.在词云图生成部分,添加掩模处理和轮廓设置。由于代码较长,我只修改相关部分。注意:如果下载掩模失败,我们可以使用一个圆形掩模代替,但效果可能不佳。或者,我们可以不使用掩模,只设置轮廓线,但这样就没有云朵形状了。这里,我们尝试从URL下载掩模,如果失败则使用一个简单的圆形掩模(通过代码生成)。生成圆形掩模的方法:```pythonifmask_imageisNone:#生成一个圆形掩模x,y=np.ogrid[:300,:300]mask=(x-150)**2+(y-150)**2>130**2mask=255*mask.astype(int)```但是,这样就是一个圆形,不是云朵。为了简化,我们先尝试下载,如果失败则不用掩模,但使用轮廓线。修改后的词云生成代码:```python#尝试下载云朵掩模mask=Nonetry:fromPILimportImageimportrequestsfromioimportBytesIO#云朵图片URLmask_url="https://raw.githubusercontent.com/amueller/word_cloud/master/examples/masks/cloud.png"response=requests.get(mask_url)mask_image=Image.open(BytesIO(response.content))mask=np.array(mask_image)print("使用云朵形状的掩模")exceptExceptionase:print(f"下载掩模失败:{e},将不使用掩模")mask=None```然后,在生成词云对象时,设置mask和contour参数。完整修改后的代码将如下所示:</think> ### 解决方案:柱状图中文显示与云朵形状词云 要解决柱状图中文显示问题和生成云朵形状词云图,需要进行以下关键修改: #### 1. 柱状图中文显示问题修复 在代码开头添加中文支持配置: ```python import matplotlib.pyplot as plt import matplotlib as mpl # 设置全局中文字体支持 plt.rcParams['font.family'] = ['SimHei'] # 使用黑体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 ``` #### 2. 云朵形状词云图生成 使用轮廓参数创建分层云朵效果: ```python from wordcloud import WordCloud import numpy as np from PIL import Image # 创建云朵形状掩码 def create_cloud_mask(): # 创建一个基本云朵形状 x, y = np.ogrid[:300, :300] mask = np.zeros((300, 300)) mask1 = (x - 150)**2 + (y - 150)**2 < 130**2 # 中间圆 mask2 = (x - 120)**2 + (y - 180)**2 < 50**2 # 左上凸起 mask3 = (x - 180)**2 + (y - 180)**2 < 50**2 # 右上凸起 mask4 = (x - 150)**2 + (y - 110)**2 < 40**2 # 底部凸起 mask = np.logical_or.reduce([mask1, mask2, mask3, mask4]) return 255 * np.array(~mask, dtype=np.uint8) # 反转(黑色表示轮廓) ``` ### 完整修改后的代码 ```python import requests import pandas as pd import re import jieba import jieba.posseg as pseg from collections import Counter import matplotlib.pyplot as plt from wordcloud import WordCloud import seaborn as sns import numpy as np import matplotlib as mpl from PIL import Image # ====================== # 1. 中文字体设置(解决方框问题) # ====================== plt.rcParams['font.family'] = ['SimHei'] # 使用黑体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # ====================== # 2. 数据加载与噪音清洗 # ====================== # 微博热榜API url = "https://weibo.com/ajax/statuses/hot_band" cookies = { "SCF": "Atd7tjiioKSLksVw7XSNkxi5F5cyOjh_kYA6R4iPrUaG4t9WLxx0cFOvRahXLbjQQZP6tNqrHjWe0uZO_NC2HG8.", "SUB": "_2A25FR7uEDeRhGeFH6lUY8yvEwziIHXVmPLFMrDV8PUNbmtAbLXjHkW9Ne9sVtBXy4xW_ny2_cj73Iknd8X1Xv9zi", "SUBP": "0033WrSXqPxfM725Ws9jqgMF55529P9D9WW4ATZM98nvQ774WfWG8RJ.5NHD95QN1K2N1Kef1hnXWs4DqcjMi--NiK.Xi-2Ri--ciKnRi-zNS0.pS0.0SKnRS5tt", "ALF": "02_1751865557", "XSRF-TOKEN": "s8dQ_T9a9JEpVhleuHZEAUGn", "PC_TOKEN": "2714683c19", "WBPSESS": "thILuXQ1w8FjHm2phr8ykyNoiO95wc6N6vU8knN1G5E8oQ1KGmrNvK-0MeRsdJJ_3ApByqSdOfDGeRNuXzxQBddj0eKTs6PmX1-T3zzaKO9-gRD5-dvW4mz_6CYt5Kf9Yfjnj5Ttet5Laz_PmXyDzQ==" } # 创建云朵形状掩码函数 def create_cloud_mask(): # 创建一个基本云朵形状 x, y = np.ogrid[:300, :300] mask = np.zeros((300, 300)) mask1 = (x - 150)**2 + (y - 150)**2 < 130**2 # 中间圆 mask2 = (x - 120)**2 + (y - 180)**2 < 50**2 # 左上凸起 mask3 = (x - 180)**2 + (y - 180)**2 < 50**2 # 右上凸起 mask4 = (x - 150)**2 + (y - 110)**2 < 40**2 # 底部凸起 mask = np.logical_or.reduce([mask1, mask2, mask3, mask4]) return 255 * np.array(~mask, dtype=np.uint8) # 反转(黑色表示轮廓) # 爬取微博热榜 def fetch_weibo_hot(): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "X-XSRF-TOKEN": cookies["XSRF-TOKEN"] } response = requests.get(url, headers=headers, cookies=cookies) data = response.json() hot_list = [] # 处理API响应结构变化 for item in data['data']['band_list'][:10]: # 尝试获取热度值(字段可能已变更) hot_value = item.get('raw_hot', item.get('num', item.get('hot_value', 0))) # 获取话题名称 topic = item.get('note', item.get('word', '未知话题')) hot_list.append({ "rank": item.get('rank', 0), "topic": topic, "hot": hot_value }) return pd.DataFrame(hot_list) # 数据清洗函数 def clean_text(text): # 如果text是NaN或其他非字符串类型 if not isinstance(text, str): return "" # 移除URL text = re.sub(r'https?://\S+|www\.\S+', '', text) # 移除@用户名 text = re.sub(r'@\w+', '', text) # 移除话题标签 text = re.sub(r'#\w+#', '', text) # 移除表情符号 text = re.sub(r'\[.*?\]', '', text) # 移除特殊符号 text = re.sub(r'[【】/**…→↓↑←★☆《》<>()()【】{}「」]', '', text) # 移除多余空格 text = re.sub(r'\s+', ' ', text).strip() return text # 主流程 print("正在获取微博热榜数据...") try: # 爬取数据并保存 df = fetch_weibo_hot() df.to_csv("weibo_hot_top10.csv", index=False, encoding='utf-8-sig') print("微博热榜数据已保存到 weibo_hot_top10.csv") # 读取CSV数据 df = pd.read_csv("weibo_hot_top10.csv") # 清洗文本 print("正在清洗文本数据...") df['cleaned_topic'] = df['topic'].apply(clean_text) print(f"清洗后示例:\n{df['cleaned_topic'].head()}") except Exception as e: print(f"数据加载失败: {e}") # 如果API失败,使用示例数据继续运行 print("使用示例数据继续运行...") data = { 'rank': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'topic': [ '全球气候变化峰会召开', '科技巨头发布新一代AI产品', '国际体育赛事圆满结束', '新电影票房破纪录', '健康饮食新趋势', '教育政策改革引发讨论', '旅游热门目的地推荐', '数字经济创新发展', '环保行动倡议', '文化传承与创新' ], 'hot': [5000000, 4500000, 4000000, 3800000, 3500000, 3300000, 3000000, 2800000, 2500000, 2200000] } df = pd.DataFrame(data) df['cleaned_topic'] = df['topic'].apply(clean_text) # ============================ # 2. 文本分词与停用词过滤 # ============================ # 加载停用词表 try: with open("stopwords.txt", "r", encoding="utf-8") as f: stopwords = set([line.strip() for line in f]) print("停用词表加载成功") except FileNotFoundError: print("未找到stopwords.txt,使用内置停用词") # 基础停用词 stopwords = set( "的 了 在 是 我 你 他 她 它 我们 你们 他们 啊 呀 吧 呢 吗 和 与 或 有 就 都 而 及 以及 等 等等".split()) # 添加额外停用词 additional_stopwords = {"微博", "热搜", "话题", "新闻", "今天", "每日", "热门", "查看", "搜索", "点击"} stopwords |= additional_stopwords # 初始化jieba分词器 jieba.initialize() # 分词函数 def segment_text(text): words = jieba.lcut(text) return [word for word in words if word not in stopwords and len(word) > 1] # 应用分词 print("正在进行中文分词...") df['segmented'] = df['cleaned_topic'].apply(segment_text) print(f"分词结果示例:\n{df['segmented'].head()}") # ================================== # 3. 词频与词性统计分析 # ================================== # 合并所有分词结果 all_words = [word for sublist in df['segmented'].tolist() for word in sublist] if not all_words: print("分词结果为空,添加示例词汇") all_words = ['科技', '发展', '创新', '文化', '环保', '健康', '教育', '旅游', '经济', '体育'] word_freq = Counter(all_words) # 获取前10高频词 top_words = word_freq.most_common(10) top_df = pd.DataFrame(top_words, columns=['关键词', '频率']) # 绘制柱状图(已解决中文显示问题) plt.figure(figsize=(12, 6)) sns.barplot(x='频率', y='关键词', data=top_df, palette="viridis") plt.title('微博热榜Top10高频词汇', fontsize=16) plt.xlabel('出现频率', fontsize=12) plt.ylabel('关键词', fontsize=12) plt.tight_layout() plt.savefig('top10_words.png', dpi=300) print("高频词汇柱状图已保存为 top10_words.png") plt.show() # 词性标注函数 def pos_tagging(words): return [(word, flag) for word, flag in pseg.cut("".join(words)) if word not in stopwords] # 词性标注 print("正在进行词性标注...") df['pos_tags'] = df['segmented'].apply(pos_tagging) all_pos = [flag for sublist in df['pos_tags'].tolist() for _, flag in sublist] if not all_pos: print("词性标注为空,添加示例数据") all_pos = ['n', 'n', 'v', 'n', 'a', 'n', 'n', 'n', 'n', 'n'] pos_freq = Counter(all_pos) # 常见词性说明 pos_names = { 'n': '名词', 'v': '动词', 'a': '形容词', 'd': '副词', 'm': '数词', 'q': '量词', 'r': '代词', 'p': '介词', 'c': '连词', 'u': '助词', 'xc': '其他虚词', 'w': '标点符号' } # ================= # 4. 生成云朵形状词云图 # ================= # 生成词云文本 text_for_wordcloud = " ".join(all_words) if not text_for_wordcloud.strip(): text_for_wordcloud = "科技 发展 创新 文化 环保 健康 教育 旅游 经济 体育" print("正在生成云朵形状词云图...") # 创建云朵形状掩码 cloud_mask = create_cloud_mask() # 创建词云对象(设置云朵形状) wc = WordCloud( font_path='simhei.ttf', # 确保使用中文字体 mask=cloud_mask, # 使用云朵形状掩码 background_color='white', width=1000, height=700, max_words=150, colormap='viridis', contour_width=3, # 轮廓线宽度 contour_color='steelblue', # 轮廓线颜色(实现一层空一层有字效果) scale=2, # 提高分辨率 prefer_horizontal=0.6, # 增加横向词比例 relative_scaling=0.5, # 调整词频缩放 min_font_size=10 # 设置最小字体 ) # 生成词云 wc.generate(text_for_wordcloud) # 保存词云 plt.figure(figsize=(14, 10)) plt.imshow(wc, interpolation='bilinear') plt.axis("off") plt.title('微博热榜关键词词云', fontsize=18, pad=20) plt.savefig('wordcloud.png', bbox_inches='tight', dpi=300) print("云朵形状词云图已保存为 wordcloud.png") plt.show() # ================= # 5. 附加分析 # ================= # 高频词性分布 plt.figure(figsize=(12, 7)) top_pos = pos_freq.most_common(8) pos_data = [] for tag, count in top_pos: name = pos_names.get(tag, f'其他({tag})') pos_data.append((name, count)) pos_df = pd.DataFrame(pos_data, columns=['词性', '数量']) sns.barplot(x='数量', y='词性', data=pos_df, palette="rocket") plt.title('高频词性分布', fontsize=16) plt.xlabel('数量', fontsize=12) plt.ylabel('词性', fontsize=12) plt.tight_layout() plt.savefig('pos_distribution.png', dpi=300) print("词性分布图已保存为 pos_distribution.png") plt.show() # 名词和形容词统计 nouns = sum(1 for tag in all_pos if tag == 'n') adjectives = sum(1 for tag in all_pos if tag == 'a') verbs = sum(1 for tag in all_pos if tag == 'v') total_tags = len(all_pos) if len(all_pos) > 0 else 1 # 避免除以零 print("\n=== 词性分析结果 ===") print(f"名词占比: {nouns / total_tags:.2%} ({nouns}个)") print(f"动词占比: {verbs / total_tags:.2%} ({verbs}个)") print(f"形容词占比: {adjectives / total_tags:.2%} ({adjectives}个)") print(f"情感类形容词数量: {adjectives}个") # 保存处理后的数据 df.to_csv("processed_weibo_data.csv", index=False, encoding='utf-8-sig') print("\n数据处理完成! 结果已保存到 processed_weibo_data.csv") ``` ### 主要修改说明 1. **柱状图中文显示修复**: - 添加了全局字体设置:`plt.rcParams['font.family'] = ['SimHei']` - 解决了负号显示问题:`plt.rcParams['axes.unicode_minus'] = False` 2. **云朵形状词云图实现**: - 创建了`create_cloud_mask()`函数生成云朵轮廓 - 在WordCloud中设置关键参数: ```python mask=cloud_mask, # 云朵形状 contour_width=3, # 轮廓线宽度 contour_color='steelblue' # 轮廓线颜色(实现一层空一层有字效果) ``` 3. **词云图优化**: - 添加参数`prefer_horizontal=0.6`平衡横竖词分布 - 设置`relative_scaling=0.5`调整词频分布 - 使用`min_font_size=10`确保小词可读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值