我有两个 G729 编码文件,我采用了它们的 pcm 版本。我想测量这两个文件之间的相似性。这些文件是二进制文件,所以如何测量二进制文件之间的相似性,我用 C 语言编写了一个代码,该代码从第一个文件中获取模式并在第二个文件中搜索相似的文件,但我想要一个相似性度量...... . 我在文献中搜索了很多,我找到了 jaccard 和其他人,但仍然无法确定其中哪些符合我的情况。提前感谢您的帮助..
问问题
1638 次
2 回答
2
由于您提到文件是音频文件,因此最好根据音频特征定义相似性度量,而不是简单地进行二进制比较。快速搜索找到了一个名为MusicMiner的研究项目,您可能想进一步了解它。
于 2010-10-06T15:50:20.837 回答
0
我有同样的需求,我想出了一个在我的案例中有效的解决方案,但我不能保证它是通用的:
我采用了一个创建差异文件的库。给定 fileA 和 fileB,这个库创建了第三个文件 fileDiff,它告诉如何从 fileA 传递到 fileB 哪些字节要复制,哪些要添加。(有关格式的更多信息:http: //www.w3.org/TR/NOTE-gdiff-19970901.html)
- 我在 Java 中工作,所以我使用了 javaxdelta:http: //javaxdelta.sourceforge.net/
- 在这里您可以实现一个称为 DiffWriter 的接口:http: //javaxdelta.sourceforge.net/javadoc/com/nothome/delta/DiffWriter.html
- 最后,您知道复制了多少字节以及添加了多少字节以从 fileA 转到 fileB
通过一个函数,我得到一个百分比。我知道这不是 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 回答