none
Поиск по частичному совпадению в массиве RRS feed

  • Вопрос

  • Доброго вечера.

    Стоит с одной стороны тривиальная задача, но не знаю с какой стороны к ней подойти.

    Есть два массива

    Массив 1:

    Селитра кальциевая 4водн./Нитрат кальция  (К), кг  
    Селитра аммиачная/Нитрат аммония, кг
    Шмелиная семья (улей)

    Массив 2:

    Нитрат кальция концентрированный (селитра кальциевая), кг

    Шмели, улей, шт

    Задача состоит в том, чтобы найти в массиве 1 данные из массива 2.

    Делал следующим образом:

    string[] names = { "Селитра кальциевая 4водн./Нитрат кальция  (К), кг  ", "Селитра аммиачная/Нитрат аммония, кг", "Шмелиная семья (улей)" };
    string match = Array.Find (names, n => n.Contains ("Шмели, улей, шт")); 

    Такой подход не оправдался , так как % совпадений минимальный.

    Пробовал разбивать на составляющие искомую строку:

    string text = "Шмели, улей, шт";
     
    string[] words = text.Split(new char[] { ' ' });
    И потом выполнять поиск по полученным словам, но в данном случае получаем избыточный результат.

    Посоветуйте как реализовать поиск с такими условиями?

    8 ноября 2019 г. 20:34

Ответы

  • Доброго вечера.

    Стоит с одной стороны тривиальная задача, но не знаю с какой стороны к ней подойти.

    Есть два массива

    Массив 1:

    Селитра кальциевая 4водн./Нитрат кальция  (К), кг  
    Селитра аммиачная/Нитрат аммония, кг
    Шмелиная семья (улей)

    Массив 2:

    Нитрат кальция концентрированный (селитра кальциевая), кг

    Шмели, улей, шт

    Задача состоит в том, чтобы найти в массиве 1 данные из массива 2.

    Делал следующим образом:

    string[] names = { "Селитра кальциевая 4водн./Нитрат кальция  (К), кг  ", "Селитра аммиачная/Нитрат аммония, кг", "Шмелиная семья (улей)" };
    string match = Array.Find (names, n => n.Contains ("Шмели, улей, шт")); 

    Такой подход не оправдался , так как % совпадений минимальный.

    Пробовал разбивать на составляющие искомую строку:

    string text = "Шмели, улей, шт";
     
    string[] words = text.Split(new char[] { ' ' });
    И потом выполнять поиск по полученным словам, но в данном случае получаем избыточный результат.

    Посоветуйте как реализовать поиск с такими условиями?

    Задача совсем не тривиальная. Почитайте как работает поиск в Web, вам надо будет сделать примерно то же самое - построить индекс по одному массиву и данные из второго использовать как поисковый запрос.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 ноября 2019 г. 19:36
    Модератор

Все ответы

  • Доброго вечера.

    Стоит с одной стороны тривиальная задача, но не знаю с какой стороны к ней подойти.

    Есть два массива

    Массив 1:

    Селитра кальциевая 4водн./Нитрат кальция  (К), кг  
    Селитра аммиачная/Нитрат аммония, кг
    Шмелиная семья (улей)

    Массив 2:

    Нитрат кальция концентрированный (селитра кальциевая), кг

    Шмели, улей, шт

    Задача состоит в том, чтобы найти в массиве 1 данные из массива 2.

    Делал следующим образом:

    string[] names = { "Селитра кальциевая 4водн./Нитрат кальция  (К), кг  ", "Селитра аммиачная/Нитрат аммония, кг", "Шмелиная семья (улей)" };
    string match = Array.Find (names, n => n.Contains ("Шмели, улей, шт")); 

    Такой подход не оправдался , так как % совпадений минимальный.

    Пробовал разбивать на составляющие искомую строку:

    string text = "Шмели, улей, шт";
     
    string[] words = text.Split(new char[] { ' ' });
    И потом выполнять поиск по полученным словам, но в данном случае получаем избыточный результат.

    Посоветуйте как реализовать поиск с такими условиями?

    Задача совсем не тривиальная. Почитайте как работает поиск в Web, вам надо будет сделать примерно то же самое - построить индекс по одному массиву и данные из второго использовать как поисковый запрос.

    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 ноября 2019 г. 19:36
    Модератор
  • Спасибо за совет, он сподвиг меня немного более глубже ознакомиться с проблемой.

    Для своей задачи нашел описание алгоритма нечеткого поиска, в частности использовал Longest Common Subsequence. Который дал требуемый результат с большой долей совпадений.

    13 ноября 2019 г. 17:11