利用词袋实现短文本相似度计算

输入两句文本:
我 在 中科院 自动化所
我 在 中科院 计算机所

可统计到词袋中[我, 我, 在, 在, 中科院, 中科院, 自动化所, 计算机所], 共8个词
然后统计两句文本中相同词的个数为2(我)+2(在)+2(中科院)=6 个词
那么计算相似概率为6/8=0.75

简易代码实现:

  1. import java.io.BufferedReader;   
  2. import java.io.FileReader;   
  3. import java.io.FileWriter;   
  4. import java.io.IOException;   
  5. import java.util.ArrayList;   
  6.   
  7. public class similiarity_Matrix {   
  8.     public static void main(String[] args) throws IOException {   
  9.         int n = 0;   
  10.         String readspk = “”;   
  11.         ArrayList<String> tempStr = new ArrayList<String>();   
  12.         FileReader fr = new FileReader(“Data\\jacoxutest\\test1.txt”);   
  13.         BufferedReader br = new BufferedReader(fr);   
  14.         FileWriter fw = new FileWriter(“Data\\jacoxutest\\test1result.txt”);   
  15.   
  16.         while ((readspk = br.readLine()) != null)   
  17.             tempStr.add(readspk);   
  18.         n = tempStr.size();   
  19.   
  20.         // 建立相似度矩阵   
  21.         double[][] smatrix = new double[n][n];   
  22.         createMatrix(tempStr, smatrix, n);   
  23.   
  24.         // 输出相似度矩阵的值   
  25.         for (int i = 0; i < n; i++) {   
  26.             for (int j = 0; j < n; j++)   
  27.                 fw.append(smatrix[i][j] + “ ”);   
  28.             fw.append(“\r\n”);   
  29.         }   
  30.         fw.close();   
  31.     }   
  32.   
  33.     private static double[][] createMatrix(ArrayList<String> tempStr,   
  34.             double[][] smatrix, int n) {   
  35.   
  36.         double svalue, tempValue;   
  37.   
  38.         for (int i = 0; i < n; i++) {   
  39.             // String[] str1 = null;   
  40.             String[] str1 = tempStr.get(i).split(“ ”);   
  41.             for (int j = i + 1; j < n; j++) {   
  42.                 //String[] str2 = null;   
  43.                 ArrayList<String> wrodSet = new ArrayList<String>();   
  44.                 ArrayList<String> tempstr1 = new ArrayList<String>();   
  45.                 ArrayList<String> tempstr2 = new ArrayList<String>();   
  46.   
  47.                 String[] str2 = tempStr.get(j).split(“ ”); //每行内容以空格把词分开   
  48.                 creatSet(str1, str2, wrodSet);//把str1和str2的词都添加到wordSet集合中去   
  49.                 simply(str1, tempstr1);   
  50.                 simply(str2, tempstr2);   
  51.   
  52.                 double length = wrodSet.size();   
  53.                 int sum = 0;   
  54.                 for (int a = 0; a < tempstr1.size(); a++) { //???遍历很耗时的,采用其他方式HashSet   
  55.                     String temp1 = tempstr1.get(a);   
  56.                     int count = 0;   
  57.                     for (int b = 0; b < tempstr2.size(); b++) {   
  58.                         String temp2 = tempstr2.get(b);   
  59.                         if (temp2.equals(temp1)) {   
  60.                             for (int c = 0; c < wrodSet.size(); c++) {   
  61.                                 String temp3 = wrodSet.get(c);   
  62.                                 if (temp2.equals(temp3))   
  63.                                     count++;   
  64.                             }   
  65.                         }   
  66.                     }   
  67.   
  68.                     if (count != 1)   
  69.                         sum = sum + count;   
  70.                 }   
  71.                 tempValue = (double) sum / length;   
  72. //              svalue = (double) (Math.round(tempValue * 10000) / 10000.0);   
  73.                 smatrix[i][j] = smatrix[j][i] = tempValue;   
  74.             }   
  75.             System.out.println();   
  76.         }   
  77.         for (int k = 0; k < n; k++) {   
  78.             smatrix[k][k] = 1;   
  79.         }   
  80.         return smatrix;   
  81.   
  82.     }   
  83.   
  84.     private static void simply(String[] str, ArrayList<String> tempstr) {   
  85.         for (int i = 0; i < str.length; i++)   
  86.             tempstr.add(str[i]);   
  87.         for (int i = 0; i < tempstr.size(); i++) { //换HashSet就不用再添加去重操作了!!   
  88.             for (int j = i + 1; j < tempstr.size(); j++) {   
  89.                 if ((tempstr.get(i)).equals(tempstr.get(j))) {   
  90.                     tempstr.remove(j);   
  91.                     j–;   
  92.                 }   
  93.             }   
  94.         }   
  95.   
  96.     }   
  97.   
  98.     private static void creatSet(String[] str1, String[] str2,   
  99.             ArrayList<String> wrodSet) {   
  100.         for (int i = 0; i < str1.length; i++)   
  101.             wrodSet.add(str1[i]);   
  102.         for (int i = 0; i < str2.length; i++)   
  103.             wrodSet.add(str2[i]);   
  104.     }   
  105.   
  106. }  

通过以上简易代码可生成相似度矩阵[1.0 0.75; 0.75, 1.0]

发表评论

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

*

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