本人菜鸡一只,八百多年前(当然这是夸张的手法),在我写下第一个爬虫篇的博客的时候,我给自己挖了一个坑!
在我的爬虫篇的第一篇文章中(链接如下,该系列总共有六篇文章)
【python】爬虫篇:python连接postgresql(一):https://blog.csdn.net/lsr40/article/details/83311860
【python】爬虫篇:python对于html页面的解析(二):https://blog.csdn.net/lsr40/article/details/83380938
【python】爬虫篇:python使用psycopg2批量插入数据(三):https://blog.csdn.net/lsr40/article/details/83537974
【pykafka】爬虫篇:python使用python连接kafka介绍(四):https://blog.csdn.net/lsr40/article/details/83754406
【python】爬虫篇:通过文章内容使用TF-IDF算法对文章进行分类(五): https://blog.csdn.net/lsr40/article/details/87281966
还有本文中提到的处理方式有具体整理过的代码:
【python】爬虫篇:最后一篇之TF-IDF分类代码篇(六):https://blog.csdn.net/lsr40/article/details/87385105
另外因为用到了kafka,所以对kafka做了些简单的介绍
【kafka】一、kafka框架介绍(消费者篇):https://blog.csdn.net/lsr40/article/details/84029034
【kafka】二、kafka框架介绍(消费者篇):https://blog.csdn.net/lsr40/article/details/84034394
其实爬虫篇从头到尾都在说爬取文章的正文和相关信息,然后存入数据库,其实这个步骤是为了后面分类做准备!!
1、前言:
文本的分类是根据著名学者吴军的著作《数学之美》中的第14章 余弦定理和新闻的分类中提供的思路来实现的,所以我是踩在前人帮大家搬的凳子上看世界的(在这里还是要向各位前辈们说声谢谢!),希望各位有机会可以拜读下他的作品
现有爬虫爬到的文章300W篇,约有50W是有分类标签的,其余的250W篇是没有标签的,由于该分析需要将正文文本内容做分析,因此从50W篇有分类的文章中抽取出25W(文章内容长度大于10)进行分析。
2、正文:
开始说说实现步骤:
2.1、分词
通过python的结巴分词,将25W(已有分类的文章)篇文章做分词,保留TF-IDF算法排名前五的名词(什么动词,停顿词基本都去掉了)
2.2、字典
将每篇文章生成的5个名词做去重,得到9W(具体是95206)个词,将这些词做成字典,存入表中
2.3、根据字典生成向量
根据字典将已有分类的文章做成一个高度为1,长度有95206的向量。
举例说明:
文章一包含的词有弹唱(该词的tf-idf值为0.67)
文章二包含的词有中国(0.08)和赛季(0.35)
字典词汇 | 中国 | 赛季 | 弹唱 | 香油 |
---|---|---|---|---|
文章一 | 0.0 | 0.0 | 0.67 | 0.0 |
文章二 | 0.08 | 0.35 | 0.0 | 0.0 |
通过如上的方式可以获得25W个已有分类的向量
并且再选择正文内容长度大于10的未分类文章,也通过相同的字典,做成向量,不过抽取了20个词做向量(本次抽取了58W个)
2.4、到现在我有25W条已经有分类的向量,还有一部分没有分类的向量,接下来就是比较问题了!一条一条比较明显不现实(因为肯定很慢)。所以我用了一个看起来蠢但是确实能解决问题而且有点效果的方法,将所有相同分类的向量相加,然后求出该分类的平均向量,假设我有20个分类,那样每条数据只需要比较20次,然后其实我不太有把握程序会多准,所以我保留了匹配度高的前三个分类!
结果大概如下(我就截了一条数据):
字段 | 分类(前面的数字是匹配度,数字越大匹配度越高) | content(正文) |
---|---|---|
数据 | | |
我粗略的看了下结果,个人感觉还是很靠谱的(能用,可行)!
缺陷和需要提升的地方:
-1.优化了余弦公式的计算(效果不明显,书中有说,其实就是分母计算一次,然后存成一个变量,不进行每次重复的计算)
-2.再次筛选了向量(筛选后剩下22W),主要去掉了分类有乱码,分类为“其他”的向量(效果不明显)
-3.现有的分类并不能囊括所有情况,例如,游戏类的文章,没有游戏的分类,因此被强行分到体育类中,所以,分类初期还是需要人工的判断
-4.比较的时间还是较长,虽然优化了比较算法,但是现在24小时也只能比较4W--5W篇新文章,速度还是很差(是否要使用多线程或者多进程的方式或者采用其他的语言来处理,因为我觉得python虽然好写,但是运算偏慢,当然只是我的个人见解,也可能是我确实对python不了解)
好了,这篇文章其实把总体的实现思路都说明了,如果有问题欢迎留言,我会写这篇文章,也是因为这个分类方式可行,精准度还是可以接受的,当然也是有可以优化的地方,下一篇文章中,我会附上具体代码!敬请期待~
本人菜鸡一只,如果有什么说错的地方,还请各位批评指出,本人坚决改正!如果有疑问欢迎留言讨论~