前段时间看到有个群在招文档分类志愿者,主要工作是把各个渠道收集到的分析报告(PDF格式)进行分类整理,就想起来机器学习中有个朴素贝叶斯算法正好是处理这种语言文字分类的利器,于是决定写一个分类的脚本来玩玩儿。
整个处理思路大致如下:
1、获取PDF文档中文字内容另存在TXT文件(pdfminer)
2、对TXT文件分词并获取特征向量(jieba)
3、划分测试集与训练集并训练模型(sklearn.naive_bayes)
4、使用模型进行预测
需要注意的是,在获取PDF文档中信息时发现部分文档格式不是很规范(比如图片形式或者带有密码),这种情况下脚步会报错终止的,为了让脚本顺利执行到底,中间加入了异常忽略处理。
脚本如下:
import importlib
import sys
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
import shutil
import os
import jieba
import numpy as np
from sklearn.naive_bayes import MultinomialNB
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
def parse(path):
'''解析PDF文本,并保存到TXT文件中'''
path_2=path.strip()
with open(path_2,'rb') as fp:
#用文件对象创建一个PDF文档分析器
parser = PDFParser(fp)
#创建一个PDF文档
doc = PDFDocument()
#连接分析器,与文档对象
parser.set_document(doc)
doc.set_parser(parser)
#提供初始化密码,如果没有密码,就创建一个空的字符串
try:
doc.initialize()
except Exception as e:
print("Unexpection error:%s" % e)
#创建PDF,资源管理器,来共享资源
rsrcmgr = PDFResourceManager()
#创建一个PDF设备对象
laparams = LAParams()
device = PDFPageAggregator(rsrcmgr,laparams=laparams)
#创建一个PDF解释其对象
interpreter = PDFPageInterpreter(rsrcmgr,device)
#循环遍历列表,每次处理一个page内容
# doc.get_pages() 获取page列表
for page in doc.get_pages():
interpreter.process_page(page)
#接受该页面的LTPage对象
layout = device.get_result()
# 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象