本人本科毕业设计题目为:《基于摘要词频信息的论文分类方法的研究和实现》,属于文本分类(Text Classification)方面的内容。本人实现了kNN文本分类器,使用语言为Matlab(因为该脚本语言使用极为直观,且非常适合数据运算,尤其是矩阵运算,故选用Matlab进行仿真),最终分类正确率达到64%左右,具有一定实际意义,故分享一下本人实现的思路,一下代码均为个人编写,仅供参考!【一些细节问题未列出,欢迎提问交流】
Part I.文本预处理:
【说明,请将path改为存放数据库database1的绝对路径!】
clear;clc;
path = 'F:\【毕业生】\毕设\00000大论文\5\database1'; %公共路径
% 1、分词(得到向量):【[A] = textread('1.txt','%s','delimiter',',. ()');】
% 2、(统一大小写->小写字母)【A = lower(A);】、去除单个数字【data = delnumber(A)】;
% 3、去除停用词;
% 4、最终得到一个5*65的cell类型矩阵AfterPrepro,矩阵中每个元素均为结构体.
Fold_num = 5; %总共有5类
File_num = 65; %每类均含65篇文本
AfterPrepro = cell(Fold_num,File_num); %创建5*65的矩阵,每个元素均为结构体类型
for label = 1:Fold_num
for file = 1:File_num
file_path = strcat(path,'\',num2str(label),'\',num2str(file),'.txt');%文件路径
%分词(得到cell类型列向量):
tmp = textread(file_path,'%s','delimiter',',. ()');
%统一大小写->小写字母 :
tmp = lower(tmp);
%去除单个数字 :
tmp = delNumber(tmp);
%去除停用词 :
AfterPrepro{label,file}.text = delStopWords(tmp);%去除停用词后的文本
%其他属性:类别label,序号seq
AfterPrepro{label,file}.label = label;
AfterPrepro{label,file}.seq = file;
end
end
Part II. 特征加权(TF/IDF算法):
%关键词在文本中出现的频数freq;
%此类别文档的总数目【N = 65】;
%此类别文档中出现该关键词的文档频数num;
%计算该关键词的权重weight;
%加载经过预处理后得到的cell类型矩阵AfterPrepro:
load('F:\【毕业生】\毕设\00000大论文\5\programs\AfterPrepro.mat')
Fold_num = 5; %总共有5类
File_num = 65; %每类均含65篇文本
N = File_num;
for label = 1:Fold_num
for seq = 1:File_num
AfterPrepro{label,seq}.tmp = freqStatistic(AfterPrepro{label,seq}.text); %用临时变量tmp进行词频统计,得到x*2的cell类型矩阵.
AfterPrepro{label,seq}.text2 = AfterPrepro{label,seq}.tmp(:,1);%经词频统计后的文本(即AfterPrepro的新域text2,是x*1的cell类型矩阵).
for n = 1:length(AfterPrepro{label,seq}.tmp(:,1))
AfterPrepro{label,seq}.freq(n,1) = Af