文本分类只要借助于分词,而在python中,分词借助于第三方库 jieba
pip install jieba
安装好jieba后,可调用API进行分词,详细可参考官方文档
我自己写了个Test 主要是从UC新闻上爬取各类别文档新闻,然后进行分类
话不多说 代码gogogo
第一部分:爬虫:###爬虫主要用BeautifulSoup 和selenuim的webdriver 根据标签查找内容 很easy!!!!!!!!!!
#-------------------------------------------------------------------------------
# Name: UC新闻爬取
# Purpose:
#@__author__: njtc.sun
#
# Created: 29/10/2016
#-------------------------------------------------------------------------------
from bs4 import BeautifulSoup
from selenium import webdriver
import time
class Spider(object):
"""
爬取UC新闻各频道新闻
url:UC新闻网站的URL
channel_num:每个频道获取新闻的个数
channel_dict:频道字典的url参数
channel_contents:每个频道下对应的新闻内容
"""
def __init__(self,url,each_channel_num):
self.url = url
self.each_channel_num= each_channel_num
self.channel_dict = {}
self.channel_contents={}
def get_resource(self,url):
'''
模拟浏览器获取网页 源码
'''
path = 'D:\Python\Scripts\phantomjs.exe'
driver = webdriver.PhantomJS(executable_path=path)
driver.get(url)
html_source = driver.page_source
driver.quit()
return html_source
def get_channel(self):
'''
获取uc新闻主页的所有频道列表
'''
model = BeautifulSoup(self.get_resource(self.url),'html.parser')
channel = model.find('div',attrs={'class':'channel-list'})
channel_dict = dict([(chan.string,chan.get('href'))for chan in channel.find_all('a')])
#删除不需要的频道
channel_dict.pop('推荐')
channel_dict.pop('热点')
channel_dict.pop('闺房')
channel_dict.pop('视频')
self.channel_dict = channel_dict
def get_contents(self):
'''
根据频道URL获取对应的新闻内容
channel_url:频道url
'''
for channel,channel_parm in self.channel_dict.items():
channel_url = self.url+channel_parm#频道url
step = 2000 #每次下滑条下滑的步长
path = 'D:\Python\Scripts\phantomjs.exe'
driver_1 = webdriver.PhantomJS(executable_path=path)
driver_1.get(channel_url)
while(True):
js="window.scrollBy(0,%s)"%step #将下滑条拖到合适的位置
driver_1.execute_script(js)
# time.sleep(2)
data = driver_1.find_elements_by_xpath('//li[@data-pos="item"]//a')
urls = [t_url.get_attribute('href') for t_url in data if t_url.get_attribute('href').startswith('http://m.uczzd.cn')]
if len(urls)< self.each_channel_num:
step +=2000
else:
break
driver_1.quit()
#重新打开webdriver查找内容
driver_2 = webdriver.PhantomJS(executable_path=path)
contents = []
for url in urls:
if len(contents) !=self.each_channel_num:
driver_2.get(url)
#根据contentShow标签获取内容
content= driver_2.find_element_by_id('contentShow').text
contents.append(content)
else:
break
driver_2.quit()
self.channel_contents[channel] = contents
def write_to_file(self,path,content):
print('#create file %s.....'%path,end='')
f = open(path,'w+',encoding='utf-8')
f.write(content)
f.close()
print(' write success.....')
def main():
url = 'http://zzd.sm.cn/webapp/index?uc_param_str=dnnivebichfrmintcpgieiwidsudsv&zzd_from=zxzx'
write_path = 'E:\资料\爬虫文本'
print('#-------------------------------------------------------')
print('#--------------------- spider start---------------------')
spider_start_time=time.time()
sp = Spider(url,200)#初始化
sp.get_channel()#获取频道
sp.get_contents()#获取内容
import os
for channel,contents in sp.channel_contents.items():
os.mkdir('%s\%s'%(write_path,channel))#创建文件夹
for content in contents:
text_path = '%s\%s\%s.txt'%(write_path,channel,contents.index(content))
sp.write_to_file(text_path, content)
print("#----------------------spider over----------------------")
print('#-------------------------------------------------------')
print('#spider process cost time : %s'%(time.time()-spider_start_time))
很easy把。。。。。。。。。。。。。。。。
第二部分 分词 分类
代码有点长,,详见附件
解释一下:::里面的函数 fenci_textrank() 这是用基于textrank提取关键词的,还有一个Chi_compute()这是计算卡方值大小的来进行特征提取的,学过文本分类相关知识 的应该知道。。。这里不详细解释。。。可查阅文献
步骤大概入下:
1.分词
2.筛选词形成一个特征词库,用于分类,可以通过很多方法提取特征词
3.计算Tf-idf,转换为空间向量,主要借助python的sk-learn库
4.调用分类器进行分类,sk-learn库很强大,里面有你想要的各种分类器。。。。。。。。。。。。。。
其实还是比较简单的。。。
python还是很强大的。。。。
希望大家一起交流python,最近在学Django,各种框架,各种折腾。。。。
还有Scala,
加油吧!!!!!!!!!!!!!!!!!!!!!!!!!