Я запустил бы путем рассмотрения спектрального. Я сделал это на этих двух звуковых файлах, которые Вы дали и там, кажется, некоторое подобие, которое Вы могли использовать. Например, основное различие между этими двумя, кажется, вокруг 40-50Hz. Мои.02.
ОБНОВЛЕНИЕ
у меня была другая идея после регистрации этого. Если Вы можете, добавить акселерометр на устройство. Затем коррелируют вибрационные и акустические сигналы . Это должно помочь с перекрестным дверным обнаружением механизма. Я думаю, что это должно хорошо коррелироваться, так как звук vibrationally управляется, где стерео, например, не. У меня было устройство, которое смогло обнаружить моего об/мин механизма с лобовым стеклом, монтируются (присоска), таким образом, чувствительность могла бы быть там. (Я не делаю обещаний, это работает!)
(источник: charlesrcook.com )
%% Test Script (Matlab)
clear
hold all %keep plots open
dt=.001
%% Van driver door
data = wavread('van_driver_door_closing.wav');
%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq' 2*abs(Y(1:NFFT/2))];
plot(spectral(:,1),spectral(:,2))
%% Repeat for van sliding door
data = wavread('van_driverdoorclosing.wav');
%Frequency analysis
NFFT = 2^nextpow2(length(data));
Y = fft(data(:,2), NFFT)/length(data);
freq = (1/dt)/2*linspace(0,1,NFFT/2);
spectral = [freq' 2*abs(Y(1:NFFT/2))];
plot(spectral(:,1),spectral(:,2))
Не знаю, насколько хорошо это будет работать, но я праздно рассматривал эту проблему в прошлом. Иногда я играл с маленьким программным устройством, называемым цепочкой Маркова
. Теперь статья в Википедии, вероятно, не будет иметь большого смысла, пока вы не увидите некоторые другие вещи, для которых цепочка Маркова хороша. Одним из примеров работы марковской цепи является этот греческий генератор . Другой пример - чат-бот MegaHAL.
Греческий язык - это тарабарщина, похожая на слова. Цепи Маркова предоставляют способ случайной генерации последовательности букв, но с взвешиванием случайных вариантов для имитации частотных паттернов исследуемого корпуса. Так, например, учитывая букву «Т», буква h с большей вероятностью появится рядом, чем любая другая буква. Итак, вы исследуете корпус (скажем, некоторые газеты, или сообщения в блогах), чтобы создать своего рода отпечаток языка, на который вы ориентируетесь.
Теперь, когда у вас есть частотная таблица / отпечаток пальца, вы можете изучить образец текста и оценить каждую букву в соответствии с вероятностью ее появления. Затем вы можете пометить буквы, вероятность удаления которых ниже определенного порога. Другими словами, фильтр неожиданности. Отфильтровывайте сюрпризы.
Есть некоторая свобода действий в том, как вы создаете свои таблицы частот. Вы не ограничены одной буквой за другой. Вы можете построить частотную таблицу, которая предсказывает, какая буква, вероятно, будет следовать за каждым орграфом (группой из двух букв), или каждым триграфом, или квадграфом. Вы можете работать с другой стороной, предсказывая вероятные и маловероятные триграфы, которые появятся в определенных позициях, учитывая предыдущий текст.
Это похоже на нечеткое регулярное выражение.
Простая эвристика, похожая на анонимный ответ:
listA = [0,1,2..9, a,b,c..z, A,B,C,..Z , ...] // alphanumerical symbols
listB = [!@$%^&...] // other symbols
Na = number_of_alphanumeric_symbols( line )
Nb = number_of_other_symbols( line )
if Na/Nb <= garbage_ratio then
// garbage
Одно из простых решений (не связанных с регулярными выражениями):
#pseudopython
number_of_punct = sum ([1 if c.ispunct () else 0 for c in line])
, если number_of_punct> len (line) / 2: line_is_garbage ()
хорошо. Или грубое регулярное выражение s / [!, '"@ # ~ $% ^ &] {5,} // g
Я выполнил комбинацию удаления строк, которые не содержат хотя бы двух трехбуквенных слов или одного шестибуквенного слова.
([az | AZ] {3,} \ s ) {2,} | ([az | AZ] {6,})
Вот реализация эвристики garbage_ratio
на Perl:
#!/usr/bin/perl
use strict;
use warnings;
while ( defined( my $chunk = read_chunk(\*DATA) ) ) {
next unless length $chunk;
my @tokens = split ' ', $chunk;
# what is a word?
my @words = grep {
/^[A-Za-z]{2,}[.,]?$/
or /^[0-9]+$/
or /^a|I$/
or /^(?:[A-Z][.])+$/
} @tokens;
# completely arbitrary threshold
my $score = @words / @tokens;
print $chunk, "\n" if $score > 0.5;
}
sub read_chunk {
my ($fh) = @_;
my ($chunk, $line);
while ( my $line = <$fh> ) {
if( $line =~ /\S/ ) {
$chunk .= $line;
last;
}
}
while (1) {
$line = <$fh>;
last unless (defined $line) and ($line =~ /\S/);
$chunk .= $line;
}
return $chunk;
}
__DATA__
Вставьте текст выше после __ DATA __
выше (без повторения текста здесь для экономии места). Конечно, использование раздела __ DATA __
предназначено для публикации автономного скрипта. В реальной жизни у вас будет код для открытия файла и т. Д.
Вывод:
Federal prosecutors on Monday charged a Miami man with the largest case of credit and debit card data theft ever in the United States, accusing the one-time government informant of swiping 130 million accounts on top of 40 million he stole previously. Gonzalez is a former informant for the U.S. Secret Service who helped the agency hunt hackers, authorities say. The agency later found out that he had also been working with criminals and feeding them information on ongoing investigations, even warning off at least one individual, according to authorities.
Ну, группа символов будет соответствовать некоторой чепухе. Возможно, проверка слов по словарю?
Кажется, там много разрывов строк там, где есть тарабарщина, так что это тоже может быть индикатором.
Интересная проблема.
Если это типичный пример, я полагаю, вы могли бы создать библиотеку общих слов и удалить любую строку, которая не соответствует ни одному из них.
Или, возможно, вы могли бы сопоставить символы и символы пунктуации и посмотреть, есть ли надежное отсечение отношения, или просто частота появления некоторых символов, которая помечает это как тарабарщину.
Тем не менее, я думаю, что должна быть какая-то логика программирования, а не просто одно регулярное выражение.
Думаю, регулярное выражение здесь не поможет. Регулярное выражение в основном соответствует детерминированному входу, т.е. регулярное выражение будет иметь предопределенный набор шаблонов, которым оно будет соответствовать. И тарабарщина в большинстве случаев бывает случайной. Один из способов - обратить проблему, то есть сопоставить соответствующий текст вместо сопоставления с тарабарщиной.
Я бы сказал, что такое регулярное выражение, как «любая пунктуация, за которой следует что-либо, кроме пробела, является спамом».
Так что в .NET это, возможно, что-то вроде
.Replace("\\p{1,}[a-zA-Z0-9]{1,}", "");
Тогда вы бы рассмотрели " любое слово с двумя или более знаками препинания подряд:
.Replace(" \\p{2,} ", "");
В любом случае, похоже, хорошее начало.
Еще один хороший метод - использовать средство проверки правописания / словарь и искать «слова» после того, как вы устранили нечитаемый материал с помощью регулярного выражения.
Мне нравится ответ @Breton - я бы предложил использовать его подход Corpus также с библиотекой известных «плохих сканирований», которые может быть легче идентифицировать, потому что «мусор» имеет большую внутреннюю согласованность, чем «хороший текст», если он исходит из плохих сканирований OCR (например, количество отдельных глифов меньше ).
Regex здесь не поможет. Я бы сказал, что если у вас есть контроль над частью распознавания, тогда сосредоточьтесь на лучшем качестве: http://www.neurogy.com/ocrpreproc.html
Вы также можете попросить пользователя помочь вам и указать тип текста, с которым вы работаете. например, если это страница из книги, то можно ожидать, что большинство строк будут одинаковой длины и в основном состоят из букв, пробелов и знаков препинания.