java 中文文本分类,中文新闻文本分类

标签:

下载搜狗新闻语料库

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目录(用于存放需要分词的文本文件和停用词表)

info-detail-602017.html

用以下代码将每个class里的300个测试数据进行分词,输出到destFile中

package weka;

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 stopWordSet = new HashSet();

//初始化停用词集

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.*;

publicclass weka {

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

{

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值