我有两个G729编码文件,我拿了它们的pcm版本。我想测量这两个文件之间的相似性。这些文件是二进制文件,所以如何测量二进制文件之间的相似性,我在C中编写了一个代码,从第一个文件中获取模式,在第二个文件中搜索类似文件,但我希望有一个相似度量...我在文献中搜索了很多,我发现了jaccard和其他人,但仍然不能确定哪一个符合我的情况。 提前感谢您的帮助..
答案 0 :(得分:2)
由于您提到文件是音频文件,因此最好根据音频特征定义相似性度量,而不是简单地进行二进制比较。快速搜索提出了一个名为MusicMiner的研究项目,您可能希望了解更多想法。
答案 1 :(得分:0)
我有同样的需求,我提出了一个解决方案,在我的案例中工作,但我无法保证它是普遍的:
我拿了一个创建diff文件的库。给定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();
}