2009-11-03 4 views
4

ВступительныйАвтоматическое нахождение нумерации моделей в именах файлов

Я работаю в учреждении, где мы имеем микроскопов. Этим ребятам может быть предложено создать 4D-фильмы с образцом: они берут, например. 10 изображений в разных положениях Z, затем подождите некоторое время (следующая временная точка) и снова возьмите 10 срезов. Им может быть предложено сохранить файл для каждого фрагмента, и они используют явный шаблон именования, что-то вроде 2009-11-03-experiment1-Z07-T42.tif. Имена файлов пронумерованы, чтобы отразить позицию Z и момент времени

Вопрос

После того как вы все эти имена файлов, вы можете использовать regex шаблон для извлечения Z и значение T, если вы знаете, базовый шаблон имени файла. Это я знаю, как это сделать.

Вопрос, который у меня есть: знаете ли вы способ автоматического генерации шаблона регулярных выражений из списка имен файлов? Например, в сети есть удивительный инструмент, который делает аналогичную вещь: txt2re.

Какой алгоритм вы использовали бы для анализа всего списка имен файлов и генерации наиболее вероятного шаблона регулярного выражения?

+0

Действительно интересный вопрос. Всякий раз, когда мне приходится делать регулярное выражение, я думаю об этом, но никогда не осмелюсь спросить, или люди могут подумать, что я сумасшедший! Потому что я думал, что это не будет даже отдаленно возможным, пока я не увижу ссылку, которую вы разместили :) –

+0

Насколько я знаю, это _exactly_, что RegexMagic для: http://www.regexmagic.com/ – Huppie

ответ

1

Прежде всего, вы пытаетесь сделать это с трудом. Я подозреваю, что это может быть невозможно, но вам придется применять некоторые методы искусственного интеллекта, и это будет намного сложнее, чем того стоит. Любые нейронные сети или система генетического алгоритма могут быть обучены распознаванию чисел Z и чисел T, считая, что формат Z[0-9]+ и T[0-9]+ всегда используется где-то в регулярном выражении.

Что я буду делать с этой проблемой, так это написать скрипт Python для обработки всех имен файлов. В этом скрипте я бы дважды совпадал с именем файла, однажды искал Z[0-9]+ и один раз искал T[0-9]+. Каждый раз я рассчитывал совпадения для Z-чисел и Т-чисел.

Я бы сохранил четыре других счетчика с текущими итогами, два для Z-чисел и два для Т-чисел. Каждая пара будет представлять количество имен файлов с 1 совпадением и те, которые имеют несколько совпадений. И я бы подсчитал общее количество обработанных файлов.

В конце концов, я бы представить следующим образом:

nnnnnnnnnn filenames processed 

Z-numbers matched only once in nnnnnnnnnn filenames. 
Z-numbers matched multiple times in nnnnnn filenames. 

T-numbers matched only once in nnnnnnnnnn filenames. 
T-numbers matched multiple times in nnnnnn filenames. 

Если вам повезет, то не будет несколько матчей на всех, и вы можете использовать регулярные выражения выше, чтобы извлечь ваши номера. Однако, если есть сколько-нибудь значительное количество совпадений, вы можете снова запустить сценарий с помощью некоторых операторов печати, чтобы показать вам имена файлов, которые вызывают множественное совпадение.Это скажет вам, может ли простая настройка регулярного выражения работать.

Например, если у вас есть 23 768 множественных совпадений на T-номерах, сделайте сценарий для печати каждого 500-го имени файла с несколькими совпадениями, что даст вам 47 образцов для проверки.

Возможно, что-то вроде [ -/.=]T[0-9]+[ -/.=] было бы достаточно, чтобы получить совпадение совпадений до нуля, а также дать одноразовое соответствие для каждого имени файла. Или в худшем случае, [0-9][ -/.=]T[0-9]+[ -/.=]

2

Существует модуль Perl под названием String::Diff, который имеет возможность генерировать регулярное выражение для двух разных строк. Пример дает это

my $diff = String::Diff::diff_regexp('this is Perl', 'this is Ruby'); 
print "$diff\n"; 

выходы:

 
this\ is\ (?:Perl|Ruby) 

Может быть, вы могли бы кормить пары имен файлов в такого рода вещи, чтобы получить начальное регулярное выражение. Однако это не даст вам захвата чисел и т. Д., Поэтому оно не будет полностью автоматическим. После получения diff вам придется вручную отредактировать или сделать какую-то замену, чтобы получить рабочее окончательное регулярное выражение.

0

Для Python см. this вопрос о TemplateMaker.

+0

Я просто вспомнил, что LOCI ребята сделали что-то подобное, нацеленное на такую ​​нумерацию изображений (среди прочего, они создают библиотеку для импорта/экспорта изображений микроскопии). Смотрите здесь: