处理数据集4STH-SIGIR2010

【生成STH-SIGIR2010使用的数据格式】
输入:训练文本train_refined.txt, 测试文本 test_refined.txt,公共词典, comWord.dic
输出:Vector Space Model,基于词频的向量空间模型,用于STH预处理,输出文件vsmOfWhole.txt

STH需要的数据格式:

数据变量名 大小 说明 完成度
fea VSM,稀疏矩阵 对应位置为词频,其他地方为0 (训练+测试) OK
gnd 类别标签n*1 (训练+测试) OK
testIdx 测试数据的标签位置 n_test*1标注哪些文本为测试数据 OK
trainIdx 训练数据的标签位置 n_train*1标注哪些文本为测试数据 OK
  1. import java.io.BufferedReader;   
  2. import java.io.BufferedWriter;   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileOutputStream;   
  6. import java.io.IOException;   
  7. import java.io.InputStreamReader;   
  8. import java.io.OutputStreamWriter;   
  9. import java.util.ArrayList;   
  10. import java.util.HashMap;   
  11.   
  12. public class Process4STHFormat {   
  13.     public static void main(String[] args) throws Exception {   
  14.         //利用纯文本和wordmap构建基于词频的向量空间模型,用于STH预处理   
  15.         //all = [test_data;train_data]!   
  16.         String sourceTextStr = “./SearchSnippets/all_refined.txt”;   
  17.         String wordMapStr = “./SearchSnippets/comWord.dic”;   
  18.         String vsmTextStr = “./SearchSnippets/vsmOfall.txt”;   
  19.         BufferedReader sourceTextRD = new BufferedReader(   
  20.                 new InputStreamReader(new FileInputStream(new File(sourceTextStr)), “UTF-8″));   
  21.         BufferedReader wordMapRD = new BufferedReader(   
  22.                 new InputStreamReader(new FileInputStream(new File(wordMapStr)), “UTF-8″));   
  23.         BufferedWriter vsmBW = new BufferedWriter(   
  24.                 new OutputStreamWriter(new FileOutputStream(new File(vsmTextStr)), “UTF-8″));   
  25.         //构造VSM词频向量空间模型   
  26.         creatVSMText(sourceTextRD,wordMapRD,vsmBW);   
  27.            
  28.         //生成类别标签,用于STH输入   
  29.         //【步骤四:生成类别标签标号,用于STH】   
  30.         System.out.println(“Start to create label text …!”);   
  31.         int[] testLabelList = {300,300,330,300,150,300,300,300};   
  32.         int[] trainLabelList = {1200,1200,1880,2360,220,880,1200,1120};   
  33.         String gndStr = “./SearchSnippets/gnd.txt”;   
  34.         String testIdxStr = “./SearchSnippets/testIdx.txt”;   
  35.         String trainIdxStr = “./SearchSnippets/trainIdx.txt”;   
  36.         BufferedWriter gndBW = new BufferedWriter(   
  37.                 new OutputStreamWriter(new FileOutputStream(new File(gndStr)), “UTF-8″));   
  38.         BufferedWriter testIdxBW = new BufferedWriter(   
  39.                 new OutputStreamWriter(new FileOutputStream(new File(testIdxStr)), “UTF-8″));   
  40.         BufferedWriter trainIdxBW = new BufferedWriter(   
  41.                 new OutputStreamWriter(new FileOutputStream(new File(trainIdxStr)), “UTF-8″));   
  42.         int labelIdx = 1;   
  43.         int numIdx = 1;   
  44.         for (int i:testLabelList) {   
  45.             for (int j = 0; j < i; j++) {   
  46.                 gndBW.write(String.valueOf(labelIdx)+“\n”);   
  47.                 testIdxBW.write(String.valueOf(numIdx)+“\n”);   
  48.                 numIdx++;   
  49.             }   
  50.             labelIdx++;   
  51.         }   
  52.         labelIdx = 1;   
  53.         for (int i:trainLabelList) {   
  54.             for (int j = 0; j < i; j++) {   
  55.                 gndBW.write(String.valueOf(labelIdx)+“\n”);   
  56.                 trainIdxBW.write(String.valueOf(numIdx)+“\n”);   
  57.                 numIdx++;   
  58.             }   
  59.             labelIdx++;   
  60.         }   
  61.         gndBW.close();   
  62.         testIdxBW.close();   
  63.         trainIdxBW.close();   
  64.            
  65.         sourceTextRD.close();   
  66.         wordMapRD.close();   
  67.         vsmBW.close();   
  68.         System.out.println(“It is done, ok!”);   
  69.     }   
  70.        
  71.     public static void creatVSMText(BufferedReader sourceTextRD,   
  72.             BufferedReader wordMapRD, BufferedWriter vsmBW) throws IOException, Exception {   
  73.         System.out.println(“Start to create VSM …!”);   
  74.         String tempLine;   
  75.         //先读入词典   
  76.         HashMap<String, Integer> wordMap = new HashMap<String,Integer>();   
  77.         while ((tempLine = wordMapRD.readLine()) != null) {   
  78.             //词典中放着词和索引号,索引号从0-20141   
  79.             wordMap.put(tempLine.split(“\\s+”)[0], Integer.valueOf(tempLine.split(“\\s+”)[1]));    
  80.         }   
  81.         //定义了这个数据集的特征维数,注意具有数据集独立化   
  82.         int dimVector = wordMap.size();   
  83.         System.out.println(“Has read the dictionary, the size is:”+wordMap.size());   
  84.         ArrayList<Integer> wordFreqList = new ArrayList<Integer>();   
  85.         int lineNum = 1;   
  86.         boolean hasWordFeature = false;   
  87.         while ((tempLine = sourceTextRD.readLine()) != null) {   
  88.             //因为数据比较多时,VSM会异常的大,我们分批处理!   
  89. //          if (!(150001<=lineNum)) { //【设置了下限    
  90. //              lineNum++;   
  91. //              continue;   
  92. //          }   
  93. //          if (!(lineNum<=155000)) { //设置了上限 】   
  94. //              break;   
  95. //          }   
  96.             hasWordFeature = false;   
  97.             //读入一行,即一个文档;   
  98.             wordFreqList.clear();   
  99.             for (int i = 0; i < dimVector; i++) {   
  100.                 wordFreqList.add(0);   
  101.             }   
  102.             String[] tokensStr  = tempLine.split(“\\s+”);   
  103.             for (String tempToken: tokensStr) {   
  104.                 if (wordMap.containsKey(tempToken)) {   
  105.                     hasWordFeature = true;   
  106.                     int index = wordMap.get(tempToken);   
  107.                     wordFreqList.set(index-1, wordFreqList.get(index-1)+1);   
  108.                 }else {   
  109.                     System.out.println(“error: the map has not contain the word:”  
  110.                             +tempToken+“ in Line:”+lineNum);   
  111.                 }   
  112.             }   
  113.             for (int tempFreq:wordFreqList) {   
  114.                 vsmBW.write(String.valueOf(tempFreq)+“ ”);   
  115.             }   
  116.             vsmBW.write(“\n”);   
  117.             if (!hasWordFeature) {   
  118.                 System.out.println(“++++++++++”+“has no word in Line:”+lineNum+“++++++++++”);   
  119.             }   
  120.             lineNum++;   
  121.         }   
  122.     }   
  123. }  

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>