2019-3-31晚7点
- 数据挖掘的历史
- 数据挖掘的简单定义
- 数据挖掘的一般方法
形成一种模式化的方法 闭环
作业
-
覆盖知识:
- 掌握自然语言分析的基本术语:词频,停用词
- jieba模块的使用 https://github.com/fxsjy/jieba
- 读取不同格式文本的方法
-
要求:
- 自选3篇文章,读取单个文本内容(txt,word,pdf),对文章进行分词(中文),使用jieba模块
- 统计每个词语出现的次数并按从大到小排序,导出邻接矩阵,同时通过停用词库排除停用词,并展示结果。统计词频时注意兼顾速度。
-
进阶:优化统计词频的算法减少统计词频的时间
最后,预习感知机 下节课讲
答:
一.自然语言分析基本术语:
1.词频
2.停用词
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