对复旦语料库的预处理

在感谢复旦语料库整理人员辛勤劳动的同时,也要指出其工作上的瑕疵。

  1. 采用了gbk编码而不是UTF-8,这导致大多Linux用户不能直接使用。
  2. 语料库包含训练集和测试集,分别包含9000多个文档,却分别有近1500个文档是重复的。
  3. 训练集和测试集中的C35-Law中的部分文件是已经经过分词处理了的(分词结果很差),且部分又不是采用的GBK编码(这给编码转换工作带来麻烦)。
  4. 有些文章只有文章头部,而没有实际的内容。

step1.下载复旦语料库的训练集测试集。解压。

step2.分别删除train和answer文件夹下的C35-Law文件夹。

step3.使用FindDupFile工具分别找到train和answer文件夹的重复文件,删除之。

step4.使用iconv.exe工具把文件从gbk编码转换到utf-8编码。

step5.为提高文本分类精度,删除所有长度小于500的文档。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class DelSmallText {
	public void delSmallText(File srcFile){
		if(srcFile.isDirectory()){
			File[] childFiles=srcFile.listFiles();
			for(File child:childFiles){
				delSmallText(child);
			}
		}
		else if(srcFile.isFile()){
			StringBuffer content=new StringBuffer();
			try{
				FileReader fr=new FileReader(srcFile);
				BufferedReader br=new BufferedReader(fr);
				String line;
				while((line=br.readLine())!=null){		//readLine()并不读取末尾的换行符
					content.append(line.trim());	//只去除行首尾的空格,因为去除空格的话连续的英文单词合并到了一起
				}
				br.close();
				if(content.toString().length()<500){
					srcFile.delete();
				}
			}catch (Exception e){
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args){
		DelSmallText inst=new DelSmallText();
		File file=new File("/home/orisun/master/fudan_corpus/train");
		inst.delSmallText(file);
	}
}

step6.删除文档中每行开头和结尾的空格,把文档合并为一行。同时给每个文档赋予一个全局编号,该编号除要写入文件名中外,还要写入文档内容的开头。用Java实现非常简单:

/**
 * Author: Orisun
 * Date: Sep 5, 2011
 * FileName: RemoveSpaceAndWrap.java
 * Function: 去除正文每行末的换行符,去除每行首尾的空格,把整个文档合并为一行.同时给每个文档赋予一个全局编号,该编号除要写入文件名中外,还要写入文档内容的开头。
 */

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;

public class RemoveSpaceAndWrap {
	int rank=0;
	//把文件名写入文档开头,用一个制表符与正文内容隔开。去除正文每行末的换行符,把整个文档合并为一行,去除正文行间的空格.
	public void delWrapAndSpace(File srcFile){
		
		if(srcFile.isDirectory()){
			File[] childFiles=srcFile.listFiles();
			for(File child:childFiles){
				delWrapAndSpace(child);
			}
		}
		else if(srcFile.isFile()){
			//把文档编号写入文档开头
			StringBuffer content=new StringBuffer(String.valueOf(rank)+"\t");
			try{
				FileReader fr=new FileReader(srcFile);
				BufferedReader br=new BufferedReader(fr);
				String line;
				while((line=br.readLine())!=null){		//readLine()并不读取末尾的换行符
					content.append(line.trim());	//只去除行首尾的空格,因为去除空格的话连续的英文单词合并到了一起
				}
				br.close();
				FileWriter fw=new FileWriter(srcFile);
				BufferedWriter bw=new BufferedWriter(fw);
				bw.write(content.toString());
				bw.flush();
				bw.close();
				//重命名文件,把文件编号写入文件名
				String fileName=srcFile.getName();
				String cat=fileName.split("-")[0];
				String newName=cat+"-"+String.valueOf(rank);
				srcFile.renameTo(new File(srcFile.getParent(),newName));
				rank++;
			}catch (Exception e){
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args){
		RemoveSpaceAndWrap rsw=new RemoveSpaceAndWrap();
		File file=new File("/home/orisun/master/fudan_corpus/train");
		rsw.delWrapAndSpace(file);
	}
}

step7.最后删除文档数小于100的分类。

最后剩余的语料情况是:

训练集train begin end 测试集answer begin end
C39-Sports 1070 0 1069 C39-Sports 1066 0 1065
C7-History 440 1070 1509 C7-History 447 1066 1512
C3-Art 513 1510 2022 C3-Art 508 1513 2020
C32-Agriculture 816 2023 2838 C32-Agriculture 822 2021 2842
C31-Enviornment 750 2839 3588 C31-Enviornment 741 2843 3583
C38-Politics 756 3589 4344 C38-Politics 758 3584 4341
C34-Economy 1392 4345 5736 C34-Economy 1404 4342 5745
C11-Space 473 5737 6209 C11-Space 463 5746 6208
C19-Computer 986 6210 7195 C19-Computer 984 6209 7192
Total 7196     Total 7193    



 

posted @ 2011-11-01 21:10  张朝阳  阅读(3730)  评论(1编辑  收藏  举报