G729 でエンコードされたファイルが 2 つあり、それらの pcm バージョンを使用しました。これら 2 つのファイルの類似性を測定したいと考えています。これらのファイルはバイナリ ファイルであるため、バイナリ ファイル間の類似性を測定する方法として、最初のパターンからパターンを取得し、2 番目のパターンで類似のパターンを検索するコードを C で作成しましたが、類似性を測定したい... . 文献をたくさん検索したところ、jaccard などを見つけましたが、どれが私の場合に適しているかを判断できません。よろしくお願いします..
質問する
1638 次
2 に答える
2
ファイルは音声ファイルであると述べているため、単純にバイナリ比較を行うよりも、音声の特性に基づいて類似度を定義する方がよいでしょう。クイック検索で、MusicMinerという研究プロジェクトが表示されました。この研究プロジェクトは、さらなるアイデアを探すのに役立ちます。
于 2010-10-06T15:50:20.837 に答える
0
私は同じニーズを持っていて、私の場合はうまくいく解決策を思いつきましたが、それが普遍的であるとは保証できません:
差分ファイルを作成するライブラリを使用しました。fileA と fileB を指定すると、このライブラリは、fileA から fileB にどのバイトをコピーし、どのバイトを追加するかを伝える 3 番目のファイル fileDiff を作成します。(フォーマットの詳細については: 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
- 最後に、ファイルAからファイルBに移動するためにコピーされたバイト数と追加されたバイト数がわかります
関数を使用すると、パーセンテージが得られます。これが 100% 本物ではないことはわかっています。たとえば、fileA の半分に等しい fileB がある場合、関数の類似性は 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 に答える