Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
FaNaT_96
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 425
#1

Частичный поиск совпадений в слове / фразе

25.07.2016, 13:06. Просмотров 572. Ответов 6
Метки нет (Все метки)

Здравствуйте. Каким образом можно реализовать частичный поиск на совпадение в определенном слове? Например, мне надо выбрать все слова, которые хотя бы на 70-80% похожи на слово "Режиссер". Т.е., как вариант, слова "режиссёр", "режисер", "режисёр" и т.д. тоже должны подойти под это условие отбора. Заранее я не могу знать все варианты нужных мне слов, только их первоначальный вид, т.е. "Режиссер".

Перебирать с использованием метода Contains не выйдет, придется много раз модифицировать код, добавляя в него все новые и новые слова.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2016, 13:06
Ответы с готовыми решениями:

Поиск совпадений
Помогите пожалуйста, задали начинающему такую задачку хоть вешайся... На...

Поиск совпадений
Привет, подскажите как осуществить: Пользователь вводит с клавиатуры слово,...

Поиск совпадений в массивах
Добрый вечер. Подскажите пожалуйста как найти совпадения в n массивах...

Поиск совпадений в массиве
Добрый день. нужно реализовать алгоритм на c#. Вводим массив чисел, например:...

Поиск совпадений в тексте
Очередной раз привет всем! Уже в третий раз задаю подобный вопрос. Пожалуйста...

6
freeba
Неадекват
1230 / 1032 / 196
Регистрация: 02.04.2010
Сообщений: 2,369
Записей в блоге: 2
Завершенные тесты: 2
25.07.2016, 13:53 #2
Вам подойдет любой алгоритм нечеткого поиска. Вот пример на библиотеке FuzzyString:
1
Вложения
Тип файла: 7z FuzziStringSample.7z (32.6 Кб, 3 просмотров)
EveKS
391 / 354 / 148
Регистрация: 19.04.2016
Сообщений: 1,430
Завершенные тесты: 7
25.07.2016, 13:57 #3
Интересно, а из этого что-то выйдет?)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            string word = "Обороноспособность";
            string pattern = $"[({world})+]";
 
            string example = "оборонный";
 
            MatchCollection matches = new Regex(pattern,
                RegexOptions.IgnoreCase).Matches(example);
 
            foreach (Match mat in matches)
            {
                Console.WriteLine($"Совпадение: {mat.Value}");
            }
            Console.WriteLine($"Всего совпадений {matches.Count}");
Если не торопился бы, дообдумал...

Добавлено через 51 секунду
паттерн - можно упростить, удалив дубли char.
1
FaNaT_96
18 / 18 / 15
Регистрация: 27.11.2013
Сообщений: 425
25.07.2016, 14:23  [ТС] #4
Цитата Сообщение от freeba Посмотреть сообщение
Вам подойдет любой алгоритм нечеткого поиска. Вот пример на библиотеке FuzzyString:
Нашел в документации такой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string source = "kevin";
string target = "kevyn";
 
List<FuzzyStringComparisonOptions> options = new List<FuzzyStringComparisonOptions>();
 
// Choose which algorithms should weigh in for the comparison
options.Add(FuzzyStringComparisonOptions.UseOverlapCoefficient);
options.Add(FuzzyStringComparisonOptions.UseLongestCommonSubsequence);
options.Add(FuzzyStringComparisonOptions.UseLongestCommonSubstring);
 
// Choose the relative strength of the comparison - is it almost exactly equal? or is it just close?
FuzzyStringComparisonTolerance tolerance = FuzzyStringTolerance.Strong;
 
// Get a boolean determination of approximate equality
bool result = source.ApproximatelyEquals(target, options, tolerance);
С английским у меня плохо, но если я правильно понял, то результатом работы алгоритма будет либо true, либо false? Если так, то каким образом определяется это значение? Немного не понимаю
И, если можно, объясните, пожалуйста, работу блока с опциями.

Добавлено через 6 минут
Цитата Сообщение от EveKS Посмотреть сообщение
Интересно, а из этого что-то выйдет?)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
string word = "Обороноспособность";
            string pattern = $"[({world})+]";
 
            string example = "оборонный";
 
            MatchCollection matches = new Regex(pattern,
                RegexOptions.IgnoreCase).Matches(example);
 
            foreach (Match mat in matches)
            {
                Console.WriteLine($"Совпадение: {mat.Value}");
            }
            Console.WriteLine($"Всего совпадений {matches.Count}");
Если не торопился бы, дообдумал...
Добавлено через 51 секунду
паттерн - можно упростить, удалив дубли char.
В принципе, если кол-во совпадений затем перевести, допустим в проценты и проверять входит ли результат, скажем в рубеж 80%+, то вполне адекватный вариант
0
freeba
Неадекват
1230 / 1032 / 196
Регистрация: 02.04.2010
Сообщений: 2,369
Записей в блоге: 2
Завершенные тесты: 2
25.07.2016, 15:09 #5
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
но если я правильно понял, то результатом работы алгоритма будет либо true, либо false? Если так, то каким образом определяется это значение? Немного не понимаю
И, если можно, объясните, пожалуйста, работу блока с опциями.
Правильно поняли, true - будет возвращено если слова нечетко совпадают. В библиотеке собрано несколько алгоритмов поиска они задаются как раз через опции. Чтобы понять что там творится можно почитать статью на хабре, общее представление она даст.
1
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 346
30.07.2017, 11:26 #6
Я конечно понимаю, год прошел... Но есть вопрос что будет со словами "Кучка" и "Тучка"?
0
EveKS
391 / 354 / 148
Регистрация: 19.04.2016
Сообщений: 1,430
Завершенные тесты: 7
30.07.2017, 13:12 #7
Цитата Сообщение от FaNaT_96 Посмотреть сообщение
все слова, которые хотя бы на 70-80% похожи на слово.
Цитата Сообщение от vino0s Посмотреть сообщение
Но есть вопрос что будет со словами "Кучка" и "Тучка"?
5 - 100%
4 - 80%
Могу рассказать - как посчитал.
0
30.07.2017, 13:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2017, 13:12

Поиск совпадений по массиву
В строковом массиве находятся строки слова. string={&quot;hi&quot;, &quot;here&quot;, &quot;your&quot;,...

Поиск совпадений в двух массивах
Добрый день задача тривиальная. Нужно сравнить два массива и удалить из одного...

Обработка изображения (поиск совпадений)
Не подскажите есть ли в C# средства для работы с изображением в плане того что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru