1

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

4

2 回答 2

2

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

于 2010-10-06T15:50:20.837 回答
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();
    }
于 2013-06-11T12:08:25.360 回答