数据挖掘从入门到绝望之数据-分词

2019-3-31晚7点

  • 数据挖掘的历史
  • 数据挖掘的简单定义
  • 数据挖掘的一般方法
    形成一种模式化的方法 闭环

作业

  • 覆盖知识:

  • 要求:

    • 自选3篇文章,读取单个文本内容(txt,word,pdf),对文章进行分词(中文),使用jieba模块
    • 统计每个词语出现的次数并按从大到小排序,导出邻接矩阵,同时通过停用词库排除停用词,并展示结果。统计词频时注意兼顾速度。
  • 进阶:优化统计词频的算法减少统计词频的时间
    最后,预习感知机 下节课讲

答:
一.自然语言分析基本术语:
1.词频
2.停用词

分词原理参考:https://mp.weixin.qq.com/s?__biz=MzIxODM4MjA5MA==&mid=2247485707&idx=1&sn=86860bdbfe60f8bd930025b86a9520f5&chksm=97ea236ea09daa78f72163acfefa096a12e8b96516bf3706c95958a8340c1e10fde55b124932&scene=21#wechat_redirect

1.词频:在数据挖掘的文本处理中,当我们进行文本向量化后,通常会使用到TF—IDF预处理。TF指的是词频。即一段文本中统计某个词出现的频率。但是通过词频来进行分词的不足就是,他是通过词频分词 ,计算分词的联合分布概率,从而导致,如:“”“I come to china to have a tourist.”其中to出现两次,比china 和tourist的次数多,从而概率比china tourist要大,其重要性也大。但是事实上 这句话的重点是china 与 tourist. 为了解决这个问题就有IDF,来描述分词的重要性的。

概括来讲, TF反映一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低,比如上文中的“to”。而反过来如果一个词在比较少的文本中出现,那么它的IDF值应该高。比如一些专业的名词如“Machine Learning”。极端情况是一个词在所有的文本中都出现,那么它的IDF值应该为0。

2.取名词,停用词

首先说取名词,一篇文本,里边有好多词是没有用的,尤其对于判断这篇文本是某一类文本的时候。比如形容词,副词,助词什么的,这类词对我们判断文本属于哪一类没有任何作用,只有名词是比较能够代表某一类文本的,所以我们要把名词给取出来,然后用这些个名词去作为某一类文本的特征。停用词是一些没有用的废词。

停用词,取名词参考:https://blog.csdn.net/yangshaoby/article/details/42101669

二.分词 jieba模块的基本使用
1.配置:pip install jieba或pip3 install jieba
2.python中分词jieba模块(分中文)的使用参考: https://github.com/fxsjy/jieba

三.读取不同文本格式的方法:
1.读取txt文档数据,并进行分词,并保存

import os
import jieba#中文分词模块
#对txt文本进行分词
if __name__ == "__main__":
    file_name="E:\\数据资料\\数据挖掘\\分词\\(txt)数据.txt"
    save_path="E:\\数据资料\\数据挖掘\\分词\\(txt)分词结果.txt"
    #打开数据文本
    f=open( file_name,'rb')
    p=f.read()
    cuts="/".join(jieba.lcut(p))
    #将分词好的,放入另一个文档里
    for cut in cuts:
        b= open(save_path, 'a',encoding="gbk")
        b.write (cut)
        b.close()
    print("分词成功,保存成功")

2.读取docx文档文本数据,并进行分词,最好保存`


#读取docx中的文本并分词代码示例
'''
1,Document对象,表示一个word文档。
2,Paragraph对象,表示word文档中的一个段落
3,Paragraph对象的text属性,表示段落中的文本内容。
'''
import jieba
import docx

if __name__=="__main__":
    file_name="E:\\数据资料\\数据挖掘\\分词\\(docx)数据.docx"
    save_path="E:\\数据资料\\数据挖掘\\分词\\(docx)分词结果.txt"
#获取file文档对象
    file=docx.Document(file_name)
    #print("段落数:"+str(len(file.paragraphs)))#段落数为5,每个回车隔离一段

    # 输出段落编号及段落内容
    for i in range(len(file.paragraphs)):
        print("第" + str(i) + "段的内容是:" + file.paragraphs[i].text)
    #输出每一段的内容
    for para in file.paragraphs:
        #print(para.text)
        contents=para.text
        cuts="/".join(jieba.lcut(contents))
        for cut in cuts:
            with open(save_path,"a")as f:
                f.write(cut)
                f.close()
    print("分词成功,保存成功")
    
       

3.读取pdf数据,并分词保存

# -*- coding:utf-8 -*-
import jieba
import time,os.path,requests,re
time1=time.time()
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams,LTTextBoxHorizontal
from pdfminer.pdfpage import PDFTextExtractionNotAllowed,PDFPage
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument


class CPdf2TxtManager():

    def changePdfToText(self, filePath):
        # 以二进制读模式打开
        file = open(path, 'rb')
        #用文件对象来创建一个pdf文档分析器
        praser = PDFParser(file)
        # 创建一个PDF文档对象存储文档结构,提供密码初始化,没有就不用传该参数
        doc = PDFDocument(praser, password='')
        ##检查文件是否允许文本提取
        if not doc.is_extractable:
            raise PDFTextExtractionNotAllowed

        # 创建PDf 资源管理器 来管理共享资源,#caching = False不缓存
        rsrcmgr = PDFResourceManager(caching = False)
        # 创建一个PDF设备对象
        laparams = LAParams()
        # 创建一个PDF页面聚合对象
        device = PDFPageAggregator(rsrcmgr, laparams=laparams)
        # 创建一个PDF解析器对象
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        # 获得文档的目录(纲要),文档没有纲要会报错
        #PDF文档没有目录时会报:raise PDFNoOutlines  pdfminer.pdfdocument.PDFNoOutlines
        # print(doc.get_outlines())

        # 获取page列表
        print(PDFPage.get_pages(doc))
        # 循环遍历列表,每次处理一个page的内容
        for page in PDFPage.create_pages(doc):
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout = device.get_result()
            # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象
            # 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等
            for x in layout:
                if hasattr(x, "get_text"):
                    fileNames = os.path.splitext(filePath)
                    contents= x.get_text()
                    cuts="/".join(jieba.lcut(contents))
                    for cut in cuts:
                        with open("E:\\数据资料\\数据挖掘\\分词\\(pdf)分词结果.txt", 'a+',encoding="utf-8") as f:
                            f.write(cut )
                            f.close()
                    print("分词并保存成功")
                # 如果x是水平文本对象的话
                # if (isinstance(x, LTTextBoxHorizontal)):
                #     text = re.sub(replace, '', x.get_text())
                #     if len(text) != 0:
                #         print(text)

if __name__ == '__main__':
    path = "E:\\数据资料\\数据挖掘\\分词\\(pdf)数据.pdf"
    pdf2TxtManager = CPdf2TxtManager()
    pdf2TxtManager.changePdfToText(path)
    time2 = time.time()
    print('ok,解析pdf结束!')
    print('总共耗时:' + str(time2 - time1) + 's')


对pdf文件操作参考:https://blog.csdn.net/xingxtao/article/details/79056341

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值