2010-10-06 60 views
0

我有两个G729编码文件,我把它们的pcm版本。我想测量这两个文件之间的相似度。这些文件是二进制文件,所以如何测量二进制文件之间的相似性,我在C中编写了一个代码,它从第一个文件中获取模式并在第二个文件中搜索相似的代码,但是我想要有一个相似性度量。我在文献中搜索了很多,我发现了jaccard和其他人,但仍然无法确定他们哪一个符合我的情况。 提前感谢您的帮助..测量两个二进制文件之间的相似性?

+0

http://en.wikipedia.org/wiki/Acoustic_fingerprint – 2010-10-06 15:46:58

+0

你想究竟如何量化'相似'?你想每个样本有绝对的差异吗?最小二乘回归的R^2值?这两个文件是什么? – JoshD 2010-10-06 15:50:33

+0

我想找到一个比率来定义两个文件相互之间的相似程度......这两个文件是G729编解码器的输出...我们可以从每个文件中取出20个字节的帧并测量这两个文件之间的相似度字符串和最后的平均值......足够吗? – Dobs 2010-10-09 09:43:53

回答

2

由于您提到的文件是音频文件,最好是根据音频特征定义相似性度量,而不是简单地进行二进制比较。快速搜索提出了一个名为MusicMiner的研究项目,您可能想要了解进一步的想法。

+0

首先感谢你的回复...我试图对纯文本级别进行分析......我的意思是在二进制级别..我想比较编码器的输出......谢谢 – Dobs 2010-10-09 09:40:13

0

我有同样的需要,我想出了一个解决方案,在我的情况下工作,但我不能保证这是普遍的:

我把创建的差异文件库。鉴于fileA和fileB这个库创建了第三个文件fileDiff,它告诉如何从fileA传递到fileB要复制的字节和要添加的字节。 (有关格式的更多信息:http://www.w3.org/TR/NOTE-gdiff-19970901.html

用函数获得一个百分比。 我知道这不是100%真实的,例如,如果你有fileB等于fileA的一半,这个函数的相似度是100%。

这是DiffWriter实现:

public class Distance implements DiffWriter { 

    private long newData = 0; 
    private long copiedData = 0; 

    @Override 
    public void flush() throws IOException {} 

    @Override 
    public void close() throws IOException {} 

    @Override 
    public void addData(byte arg0) throws IOException { 
     newData++; 
    } 

    @Override 
    public void addCopy(long arg0, int arg1) throws IOException { 
     copiedData += arg1; 
    } 

    public double getSimilarity() { 

     double a = (double) newData; 
     double c = (double) copiedData; 

     return ((c/(c + a)) * 100.0); 

    } 

} 

这是我如何称呼它:

import com.nothome.delta.Delta; 

    File f1 = new File(...); 
    File f2 = new File(...); 

      Distance dw = new Distance(); 

    try { 
     new Delta().compute(f1, f2, dw); 

     dw.getSimilarity(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
相关问题