中文新闻文本分类

论坛 期权论坛 脚本     
匿名网站用户   2020-12-19 13:00   895   0

下载搜狗新闻语料库
1.  下载ictclas4j

  后面的附件中,我有放上ictclas4j的源码包ictclas4j.zip

2.  在Eclipse中新建项目并进行相关配置

  首先把ictclas4j解压缩,然后把Data文件夹整个拷贝到Eclipse项目的文件夹下,而bin目录下的org文件夹整个拷贝到你Eclipse项目的bin目录下,把src目录下的org文件夹整个拷贝到Eclipse项目的src目录下。

3.  导入外部包commons-lang-2.0.jar和ectclas4j.jar包
4
.
1) 在Eclipse中新建一个java project(如:weka)

2) 按照上述第1,2,3的步骤配置好ictclas4j

3) 在weka文件目录中新建destFile目录(用于存放分词和去停用词后的结果)和srcFile目录(用于存放需要分词的文本文件和停用词表)

用以下代码将每个class里的300个测试数据进行分词,输出到destFile中
packageweka;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;

import org.ictclas4j.bean.SegResult;
import org.ictclas4j.segment.SegTag;
//import ICTCLAS.I3S.AC.ICTCLAS50;

public class FileExcludeStopWord {
//停用词词表
public static final String stopWordTable = "." + File.separator + "srcFile" + File.separator + "StopWordTable.txt";

public static void main(String[] args) {

//源文件和目的文件
String srcFile = "." + File.separator + "srcFile" + File.separator + "酒店评论.txt";
String destFile = "." + File.separator + "destFile" + File.separator + "酒店评论.txt";
new FileExcludeStopWord().fileExcludeStopWord(srcFile, destFile);
}

public void fileExcludeStopWord(String srcFile,String destFile){
try {
//读取原文件和停用词表
BufferedReader srcFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(srcFile))));
BufferedReader StopWordFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(stopWordTable))));

//将去除停用词的文本信息存入输出文件
BufferedWriter destFileBw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(destFile))));

//用来存放停用词的集合
Set<String> stopWordSet = new HashSet<String>();

//初始化停用词集
String stopWord = null;
for(; (stopWord = StopWordFileBr.readLine()) != null;){
stopWordSet.add(stopWord);
}

String paragraph = null;
for(; (paragraph = srcFileBr.readLine()) != null;){
//对读入的文本进行分词
SegTag segTag = new SegTag(1);// 分词路径的数目
SegResult segResult = segTag.split(paragraph);
String spiltResultStr = segResult.getFinalResult();
//得到分词后的词汇数组,以便后续比较
String[] resultArray = spiltResultStr.split(" ");

//过滤停用词
for(int i = 0; i< resultArray.length; i++){
//System.out.println(resultArray[i]);
if(stopWordSet.contains(resultArray[i])){
resultArray[i] = null;
}
//System.out.println(resultArray[i]);
}

//把过滤后的字符串数组存入到一个字符串中
StringBuffer finalStr = new StringBuffer();
for(int i = 0; i< resultArray.length; i++){
if(resultArray[i] != null){
finalStr = finalStr.append(resultArray[i]).append(" ");
}
}

//将过滤后的文本信息写入到指定文件中
destFileBw.write(finalStr.toString());
destFileBw.newLine();
//输出最后的去停用词之后的结果
System.out.println(finalStr);
}

//关闭输入流
destFileBw.close();
StopWordFileBr.close();
srcFileBr.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
}
}
将分好的900个新闻文本分成三类,每类放到一个文件夹中,class1,class2,class3,然后将三个文件夹放到training_1.0目录下。
建立新目录,一个放training_1.0 一个放my_arff_sava_path
在控制台下进入data_mining目录,输入以下指令
java weka.core.converters.TextDirectoryLoader -dir training_1.0 > my_arff_save_path/data.arff
java weka.filters.unsupervised.attribute.StringToWordVector -I -C -i my_arff_save_path/data.arff -o my_arff_save_path/data_vsm.arff -c last
java weka.filters.supervised.attribute.Discretize -i my_arff_save_path/data_vsm.arff -o my_arff_save_path/data_D_vsm.arff -c first
得到data_D_vsm.arff
测试
importjava.io.File;
importweka.classifiers.Classifier;
importweka.classifiers.trees.J48;
importweka.core.Instances;
importweka.core.converters.ArffLoader;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.util.*;
publicclassweka {
publicstaticvoidmain(String[]args)throwsException {
BufferedWriterdestFileBw=newBufferedWriter(newOutputStreamWriter(newFileOutputStream(newFile("E://data.txt"))));
//TODOAuto-generated method stub
Classifierm_classifier=newJ48();
FileinputFile=newFile("E://data_D_vsm.arff");//训练语料文件
ArffLoaderatf=newArffLoader();
atf.setFile(inputFile);
InstancesinstancesTrain=atf.getDataSet();// 读入训练文件
inputFile=newFile("E://data_D_vsm.arff");//测试语料文件
atf.setFile(inputFile);
InstancesinstancesTest=atf.getDataSet();// 读入测试文件
instancesTest.setClassIndex(0);//设置分类属性所在行号(第一行为0号),instancesTest.numAttributes()可以取得属性总数
doublesum=instancesTest.numInstances(),//测试语料实例数
right= 0.0f;
instancesTrain.setClassIndex(0);
m_classifier.buildClassifier(instancesTrain);//训练
for(inti= 0;i<sum;i++)//测试分类结果
{
doublepredicted=m_classifier.classifyInstance(instancesTest.instance(i));
System.out.println("预测某条记录的分类id:"+predicted+", 分类值:"
+instancesTest.classAttribute().value((int)predicted));
destFileBw.write("预测某条记录的分类id:"+predicted+", 分类值:"
+instancesTest.classAttribute().value((int)predicted));
destFileBw.newLine();
System.out.println("测试文件的分类值: "+instancesTest.instance(i).classValue() +", 记录:"
+instancesTest.instance(i));
destFileBw.write("测试文件的分类值: "+instancesTest.instance(i).classValue() +", 记录:"
+instancesTest.instance(i));
destFileBw.newLine();
System.out.println("--------------------------------------------------------------");
destFileBw.write("--------------------------------------------------------------");
destFileBw.newLine();
if(m_classifier.classifyInstance(instancesTest.instance(i))==instancesTest.instance(i).classValue())//如果预测值和答案值相等(测试语料中的分类列提供的须为正确答案,结果才有意义)
{
right++;//正确值加1
}
}
System.out.println("J48 classification precision:"+(right/sum));
destFileBw.write("J48 classification precision:"+(right/sum));
destFileBw.newLine();
destFileBw.close();
}
}
将控制台的信息输出到data.txt中
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP