首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文本自动纠错的动态算法

文本自动纠错的动态算法
EN

Stack Overflow用户
提问于 2012-04-06 19:35:55
回答 1查看 6.9K关注 0票数 9

我正在写一个自动更正程序,它使用levenshtein distance根据包含8000个单词的特定字典更正不超过64个字符的短语。

词典的每一行都包含一对“Word word_frequency”。我使用DictionarEntry对象来存储这些对。Class Dictionar Entry有两个字段: LinkedList :存储单词字符串freq :存储字典作为字典存储的频率。我从stdin中读取了64个字符串。在处理它之前,我删除了所有的空格。"Coo last“-> "Coolweather”我注意到insead在计算每个前缀的levenshtein距离时,在由levenshtein动态计算的矩阵的最后一行(参见维基百科示例),它返回所有前缀的距离。

函数lev返回一个向量,其中包含从第二个参数字符串到第一个参数字符串的所有前缀的l.distance,包括其自身。

我的问题是,我必须遵守一些额外的规则: min lev。distance -> min of words ->最大频率和->最小字典序如果解的总数大于1,我们取单词数最少的解。如果仍然有多个规则,我们遵循规则列表。

我正在应用的动态类似于背包动态。我不知道如何实现最小词数规则(最大频率规则非常相似)

这是我到目前为止尝试过的输入/输出示例,其中失败了:"sore reserved“答案应该是保留的,我得到的结果实际上是如此有效,我选择了这种方法,因为它更有效。Java的时间限制是2秒。

更新时间:4月7日。我已经找到了我的问题的解决方案,但是cpu时间太大,所以我需要优化它。它应该不高于2000毫秒,目前在6000毫秒左右。因此,现在我的主要关注点是优化它。

代码语言:javascript
复制
 public static String guess (String input, LinkedList<DictionarEntry> Dictionar){
       String curent = new String();
      String output = new String();

      int costMatrix[][][] = new int [input.length()][8000][input.length()];         
     int index[] = new int[128];
     int prev[]= new int[128];
        int d[]=new int  [128];
        int freq[]= new int[128];
        int wcount[]=new int[128];
        String values[] = new String[128];   
        for (int i=0 ; i < 128 ; i++){
                d[i]=127;
                freq[i]=0;
                wcount[i]=1;
                values[i]="";
        }           
     d[0]=0;
     freq[0]=0;

         for (int i = 0 ; i <input.length(); ++i){  

             curent=input.subSequence(i, input.length()).toString();
             long start =System.currentTimeMillis();
              for (int j = 0 ; j < Dictionar.size();++j){

                  costMatrix[i][j]=lev(Dictionar.get(j).value,curent);
                  for(int k=1;k<costMatrix[i][j].length;++k){

                      if(d[i]+costMatrix[i][j][k]<d[i+k]){
                          d[i+k]= d[i]+costMatrix[i][j][k];
                              values[i+k]=values[i]+Dictionar.get(j).value;
                              freq[i+k]=freq[i]+Dictionar.get(j).freq;
                              index[i+k]=j;
                              prev[i+k]=i;
                              wcount[i+k]=wcount[i]+1;
                      }
                       else if ((d[i]+costMatrix[i][j][k])==d[i+k])
                                        if((wcount[i]+1) <wcount[i+k]){
                              values[i+k]=values[i]+Dictionar.get(j).value;
                              freq[i+k]=freq[i]+Dictionar.get(j).freq;
                              index[i+k]=j;
                              prev[i+k]=i;
                              wcount[i+k]=wcount[i]+1;    
                                        }
                                        else if ((wcount[i]+1)==wcount[i+k])
                                         if((freq[i]+Dictionar.get(j).freq)>freq[i+k]){
                                             values[i+k]=values[i]+Dictionar.get(j).value;
                                             freq[i+k]=freq[i]+Dictionar.get(j).freq;
                                             index[i+k]=j;
                                             prev[i+k]=i;
                                             wcount[i+k]=wcount[i]+1;       
                                         }
                                         else if ((freq[i]+Dictionar.get(j).freq)==freq[i+k]){
                                             if((values[i]+Dictionar.get(j).value).compareTo(values[i+k])>0){
                                                 values[i+k]=values[i]+Dictionar.get(j).value;
                                              freq[i+k]=freq[i]+Dictionar.get(j).freq;
                                              index[i+k]=j;
                                              prev[i+k]=i;
                                              wcount[i+k]=wcount[i]+1;  
                                             }
                                         }
                  }     
              }
              long finished =System.currentTimeMillis();
                    System.out.println((finished-start)); 

      output="";

         } 

          int itr=input.length();
                   while(itr!=0){
      output = Dictionar.get(index[itr]).value + " " + output;
      itr=prev[itr]; 
  } 
     return output;
  }

我应该在哪里以及如何实现规则(理想情况下,以一种比使用矩阵更有效的方式)?

如果有任何问题,或者我留下了不清楚的东西,请随时提问

EN

回答 1

Stack Overflow用户

发布于 2012-04-06 21:28:42

有什么理由不能使用像Apache Lucene这样的现有库吗?它支持使用Levenshtein距离的fuzzy queries

除此之外,您可能需要考虑使用Suffix Trees来加速部分字符串搜索

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10042898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档