C # сравнивая похожие строки - PullRequest
1 голос
/ 14 апреля 2009

У меня есть универсальный шаблон с некоторыми именами файлов (LIST1) и другой шаблонный с полным списком имен (LIST2). Мне нужно сопоставить имена из LIST1 с аналогичными именами в LIST2. Например

LIST1
- **MAIZE_SLIP_QUANTITY_3_9.1.aif**

LIST 2
1- TUTORIAL_FAILURE_CLINCH_4.1.aif
2- **MAIZE_SLIP_QUANTITY_3_5.1.aif**
3- **MAIZE_SLIP_QUANTITY_3_9.2.aif**
4- TUTORIAL_FAILURE_CLINCH_5.1.aif
5- TUTORIAL_FAILURE_CLINCH_6.1.aif
6- TUTORIAL_FAILURE_CLINCH_7.1.aif
7- TUTORIAL_FAILURE_CLINCH_8.1.aif
8- TUTORIAL_FAILURE_CLINCH_9.1.aif
9- TUTORIAL_FAILURE_PUSH_4.1.aif

Я читал о расстоянии Левенштейна и использовал его реализацию в Framework ( SignumFramework Utilities ). Возвращает мне расстояние = 1 в строках 2 и 3. Но в моем случае строка 3 лучше, чем строка 2.

Есть ли другой способ лучше сравнивать похожие строки? Что-то более гибкое?

Ответы [ 5 ]

5 голосов
/ 14 апреля 2009

При сравнении в виде строк "9.2" не лучше, чем "5.1" для "9.1". Если вы хотите, чтобы номера версий оценивались численно, вам нужно проанализировать строки, чтобы можно было сравнивать части строк и числовые части отдельно.

2 голосов
/ 14 апреля 2009

Был простой вопрос здесь , может быть, некоторые ответы там будут актуальны?

1 голос
/ 14 апреля 2009

Существует довольно исчерпывающий набор ответов на этот ТАК вопрос . Внизу ссылка, которую я поместил на C # реализации для soundex, двойного метафона, сходства PHP и levenstein.

1 голос
/ 14 апреля 2009

Регулярное выражение может быть использовано для получения элементов, которые соответствуют названию. Номер версии можно собрать в группе регулярных выражений в сопоставлении и проанализировать в объекте .net (например, десятичном), который можно использовать для сравнения, какой из них ближе всего.

1 голос
/ 14 апреля 2009

Ваши критерии сходства могут быть комбинацией нескольких других критериев. Одним может быть расстояние Левенштейна, другим может быть, например, самая длинная общая подстрока или префикс / суффикс.

Самая длинная общая проблема с подстрокой на самом деле представляет собой особый случай расстояния редактирования, когда подстановки запрещены и только точное совпадение символов, вставка и удаление являются допустимыми операциями редактирования (см. здесь ).

Дополнительные метрики для сходства строк описаны здесь .

...