1

G729 でエンコードされたファイルが 2 つあり、それらの pcm バージョンを使用しました。これら 2 つのファイルの類似性を測定したいと考えています。これらのファイルはバイナリ ファイルであるため、バイナリ ファイル間の類似性を測定する方法として、最初のパターンからパターンを取得し、2 番目のパターンで類似のパターンを検索するコードを C で作成しましたが、類似性を測定したい... . 文献をたくさん検索したところ、jaccard などを見つけましたが、どれが私の場合に適しているかを判断できません。よろしくお願いします..

4

2 に答える 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 )

関数を使用すると、パーセンテージが得られます。これが 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 に答える