У меня есть два файла с кодировкой G729, я взял их версию для ПК. Я хочу измерить сходство между этими двумя файлами. эти файлы представляют собой двоичные файлы, поэтому, как можно измерить сходство между двоичными файлами, я написал код на C, который берет шаблоны из первого и ищет похожие во втором, но я хочу иметь меру сходства ... Я много искал в литературе, нашел Жаккара и других, но до сих пор не могу определить, кто из них подходит для моего дела. Заранее благодарим за помощь ..
Измеряете сходство между двумя двоичными файлами?
Ответы (2)
Поскольку вы упомянули, что файлы являются аудиофайлами, было бы лучше определить меру сходства на основе характеристик звука, а не просто выполнять двоичное сравнение. В результате быстрого поиска был обнаружен исследовательский проект под названием MusicMiner, в котором вы, возможно, захотите изучить дальнейшие идеи.
У меня была такая же потребность, и я придумал решение, которое в моем случае работает, но я не могу гарантировать, что оно универсально:
Я взял библиотеку, которая создает файлы diff. Для данных 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
- В конце вы знаете, сколько байтов скопировано и сколько байтов добавлено для перехода от файла A к файлу B.
с функцией я получаю процент. Я знаю, что это не на 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();
}