`
jimmee
  • 浏览: 529696 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

字符串相似算法-(3) NGram Distance

阅读更多

就是N-Gram version of edit distance

 

 public float getDistance(String source, String target) {
    final int sl = source.length();
    final int tl = target.length();
    
    if (sl == 0 || tl == 0) {
      if (sl == tl) {
        return 1;
      }
      else {
        return 0;
      }
    }

    int cost = 0;
    if (sl < n || tl < n) {
      for (int i=0,ni=Math.min(sl,tl);i<ni;i++) {
        if (source.charAt(i) == target.charAt(i)) {
          cost++;
        }
      }
      return (float) cost/Math.max(sl, tl);
    }

    char[] sa = new char[sl+n-1];
    float p[]; //'previous' cost array, horizontally
    float d[]; // cost array, horizontally
    float _d[]; //placeholder to assist in swapping p and d
    
    //construct sa with prefix
    // 填充前缀,满足n-gram
    for (int i=0;i<sa.length;i++) {
      if (i < n-1) {
        sa[i]=0; //add prefix
      }
      else {
        sa[i] = source.charAt(i-n+1);
      }
    }
    p = new float[sl+1]; 
    d = new float[sl+1]; 
  
    // indexes into strings s and t
    int i; // iterates through source
    int j; // iterates through target

    char[] t_j = new char[n]; // jth n-gram of t

    // 初始化第一横排的编辑距离
    for (i = 0; i<=sl; i++) {
        p[i] = i;
    }

    for (j = 1; j<=tl; j++) { // 开始处理第二个横排,...到tl最后一个横排
        //construct t_j n-gram,构建n-gram
        if (j < n) { // 补充前缀
          for (int ti=0;ti<n-j;ti++) {
            t_j[ti]=0; //add prefix
          }
          for (int ti=n-j;ti<n;ti++) {
            t_j[ti]=target.charAt(ti-(n-j));
          }
        }
        else { // 直接取n-gram
          t_j = target.substring(j-n, j).toCharArray();
        }
        d[0] = j;
        for (i=1; i<=sl; i++) {
            cost = 0;
            int tn=n;
            //compare sa to t_j,计算f(i,j)
            for (int ni=0;ni<n;ni++) {
              if (sa[i-1+ni] != t_j[ni]) {
                cost++;
              }
              else if (sa[i-1+ni] == 0) { //discount matches on prefix
                tn--;
              }
            }
            float ec = (float) cost/tn;
            // minimum of cell to the left+1, to the top+1, diagonally left and up +cost
            d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1),  p[i-1]+ec);
        }
        // copy current distance counts to 'previous row' distance counts
        _d = p;
        p = d;
        d = _d;
    }

    // our last action in the above loop was to switch d and p, so p now
    // actually has the most recent cost counts
    return 1.0f - ((float) p[sl] / Math.max(tl, sl));
  }

 

 

1
0
分享到:
评论

相关推荐

    SRILM的ngram训练相关的类图及流程图

    3.lmstats.countfile--ngram-count的子流程,用于构建词汇表和统计ngram的频度 4.ngram.estimate--ngram-count的子流程,在词汇表和ngram频度的基础上计算ngram条件概率以及backoff权值的过程 5.ngram.read--与训练...

    google-ngram-downloader

    它还提供了一个简单的命令行工具来下载名为google-ngram-downloader的ngram。 请参阅帮助以查看可用的操作: google-ngram-downloader help usage: google-ngram-downloader &lt;command&gt; [options] co

    java笔试题算法-DV-ngram:iclr研讨会论文“通过预测N-grams进行长电影评论情感分类学习文档嵌入”的代码

    java笔试题算法通过预测 N-gram 来学习文档嵌入以对长篇电影评论进行情感分类 此代码实现了 iclr 2016 研讨会论文中提出的 DV-ngram 模型: [Li Bofang Li, Tao Liu, Xiaoyong Du, Deyuan Zhang and Zhe Zhao - ...

    ngram 算法 尝试

    ngram 尝试算法 希望下载的人能继续编写下去。可以互相讨论

    字符串距离

    开发计算两个字符串间的编辑距离,LCS距离和N-gram距离的函数。 (1)编辑距离 ...设Ngram(a) 是字符串a中长度为N的子串的集合。两个字符串a,b的N-gram相似度NG(a,b)定义如下: NG(a,b)越大,字符串a,b越相似。

    ngram模型分词与统计算法.zip_NGram 算法_ngram 分词_ngram模型分词与统计算法_n元模型_按n-gram

    N-Gram(有时也称为N元模型)...另外一方面,N-Gram的另外一个作用是用来评估两个字符串之间的差异程度。这是模糊匹配中常用的一种手段。本文将从此开始,进而向读者展示N-Gram在自然语言处理中的各种powerful的应用。

    经典之字符串距离

    用于计算两个字符串的最小距离,这两个字符串可以在任意位置插入任意多个空格,用它们长度相等的两个子串求最小距离

    SimpleNGrams:从字符串中获取 n-gram 的最简单方法!

    input - 要拆分为 ngram 的字符串或字符串数​​组。 n - 作为数字的 ngram 大小。 默认为 2(即二元组)。 pad - 可选的填充参数。 采用布尔值或数组。 默认为 false(即无填充)。 请参阅下面的。 ...

    python-ngram-开源

    ngram是一个模块,用于计算两个字符串之间的相似度。 它与python的“ difflib.SequenceMatcher”不同,因为它更关心两个字符串的大小。 ngram是perl模块的端口和扩展,称为“ String :: Trigram”

    ngram-fingerprint:来自 Open Refine 项目的 ngram-fingerprint 算法的 JavaScript 实现

    描述的 Open Refine 项目中 ngram-fingerprint 算法的 JavaScript 实现。 算法 该算法与 Google Refine 的算法略有不同。 扩展西文字符的替换已经在第三步而不是最后一步完成。 这样做主要是为了使排序正常工作。 ...

    simstring:SimString近似字符串匹配算法的Ruby实现

    simstring SimString近似字符串匹配算法的Ruby实现。参考: SimString网站: : SimString参考实现(C ++): : SimString论文: ://www.aclweb.org/anthology/C10-1096安装gem install simstring_pure用法在IRB中...

    SRILM与ngram-count相关的主要类的类图

    SRILM与ngram-count相关的主要类的类图 使用starUML及其逆向工程工具绘制

    ngram折扣平滑算法.pdf

    ngram折扣平滑算法.pdf

    syntactic-ngram-builder

    语法n-gram的格式与Google Ngram集合( )中使用的格式相同。输入目前,默认支持的输入格式为CONLL-U,但也支持CONLL-09。 扩展的n元语法是为斯坦福依赖关系(SD)和通用依赖关系(UD)方案定义的。生成n-gram ...

    ngram-slp-0.0.2.jar

    ngram-slp-0.0.2.jar

    polyglot:使用朴素贝叶斯分类器从源代码中检测程序语言

    多语言 程序语言专家。 它用于检测程序语言,就像,但基于朴素贝叶斯分类器。 入门 使用pip安装 ...首先,我们需要在多语言训练语料... echo import os | polyglot classify --ngram=3 --top=3 --verbose --model=./mode

    google-ngram-开源

    我们的项目是根据google N-Gram数据构建和使用同现网络。 我们从Google获得了100GB的数据,其中包含5万亿个单词来构建共现网络。

    ngram-language-model:HMM Ngram 语言模型的实现

    ngram-语言模型一个 HMM Ngram 语言模型在 Python 中的实现。 目前实现了基本的 NGram 分析,并提供了一个接口来从你最喜欢的语料库中创建采样器。 使用 run_sampling_from_corpus.py 在文本文件中的语料库上创建...

    SRILM源代码分析笔记

    3.lmstats.countfile.jpg:ngram-count的子流程,用于构建词汇表和统计ngram的频度; 4.ngram.estimate.jpg:ngram-count的子流程,在词汇表和ngram频度的基础上计算ngram条件概率 以及backoff权值的过程; 5.ngram....

    java笔试题算法-big-data-made-easy:大数据变得容易

    java笔试题算法AI+大数据+云让一切变得简单 框架、库、资源和闪亮事物的列表。 灵感来自很棒的-...东西。 那些最常用或最知名的项目在这里不一一列举,可以参考awesome系列:by和by。 项目 存储设计和数据结构 - ...

Global site tag (gtag.js) - Google Analytics