python实现文本分类

文本分类只要借助于分词,而在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,

加油吧!!!!!!!!!!!!!!!!!!!!!!!!!






    
    
    


















你可能感兴趣的:(python,文本挖掘)