对复旦语料库的预处理
在感谢复旦语料库整理人员辛勤劳动的同时,也要指出其工作上的瑕疵。
- 采用了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 |
本文来自博客园,作者:张朝阳,转载请注明原文链接:https://www.cnblogs.com/zhangchaoyang/articles/2232205.html