在感谢复旦语料库整理人员辛勤劳动的同时,也要指出其工作上的瑕疵。
- 采用了gbk编码而不是UTF-8,这导致大多Linux用户不能直接使用。
- 语料库包含训练集和测试集,分别包含9000多个文档,却分别有近1500个文档是重复的。
- 训练集和测试集中的C35-Law中的部分文件是已经经过分词处理了的(分词结果很差),且部分又不是采用的GBK编码(这给编码转换工作带来麻烦)。
- 有些文章只有文章头部,而没有实际的内容。
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 |