![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
В общем нужна функция которая рассчитывает что-то вроде коэффициента корреляции (похожести) между строками.
Есть:
Хочется иметь какую-нить функцию со смыслом:
значения на выходе - [0;1]. 1 - строки совпадают (м.б. с точностью до регистра), чем ближе к нулю - тем менее строки похожи. А обработка примерно следующая - беру название из прайса и сравниваю этой функцией с эталонами. Если есть полное совпадение, то поставщик - молодец, если нет - выдаю список самых похожих эталонов на выбор девушке. |
|||
|
||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 5 Всего: 9 |
Наиболее простой, ИМХО, вариант использовать регулярные выражения ...
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Названия такого рода/состава (и в каталоге и в прайс-листах):
То есть: составные, с сокращениями(как правило необозначенными точкой на конце), части названий зачастую переставляются местами, некоторые части могут отсутствовать в прайсовом и присутствовать в каталоговом и наоборот. Так же обратите внимание на последнее название (применен toLowerCase для русских букв) Стратегия видится примерно такая: - toUpperCase() - убрать пробелы перед запятыми, поставить пробелы после недесятичных запятых - заменить латинские A, B, C, E, H, K, M, O, P, T, X на русские с таким же начертанием - \ -> /, нуль -> О, Ё -> Е, Y -> У - "["']+" -> "", "\\s+" -> " ", "^\\s+" -> "", "\\s+$" -> "" - теперь String.equals может сказать правду Если не совпали, работаем дальше - разбиваем на кусочки: String[] token = name.split("[^,0-9A-ZА-Я]+"); - считаем попарно степень схожести кусочков эталонного названия с кусочками прайсового - считаем суммарную "схожесть", нормируем. То как будем нормировать - зависит от ф-ции сравнения кусочков. А вот как их сравнивать..?.. Это сообщение отредактировал(а) Zandr - 22.10.2004, 07:29 |
|||
|
||||
| xaoc2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Репутация: нет Всего: нет |
Похоже регулярное выражение, для каждой позиции прайса должно быть уникальным
(если не будет найден универсальный алгоритм) в PHP4 была функция sql_regcase() , которая формировала регулярное выражение на основе входной строки: http://pl2.php.net/manual/ru/printwn/funct...sql-regcase.php , может быть разгадка здесь? |
|||
|
||||
| Светлая |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 26.10.2004 Где: В сети я проживаю Репутация: нет Всего: нет |
Zandr
В Java есть класс для обработки строк. Называется StringTokenizer. Там и куча функций имеется. Описание могу прислать. Оно из MSDN(Visual Studio) и на английском, естественно. Пиши, если нужно, скопирую и вышлю. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Привет Светлая.
Приятно, что Вы к нам заглянули. Мы тут копим людские ресурсы по JAVA, так что будем всегда рады видеть. Только по поводу StringTokenizer я не соглашусь. Он же в принципе для разбивки строки на элементы. split это тоже так делает, только более эффектвино в плане понимания чего делаешь (работать может и медленнее будет). Добавлено @ 18:44 А нельзя пойти от фонетического совпадения ? Выписать основные сочетания букв и как они читаются. Хотя может и бред все это. А не хотите задать этот вопрос в "Алгоритмах" ? |
|||
|
||||
| Светлая |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 26.10.2004 Где: В сети я проживаю Репутация: нет Всего: нет |
AntonSaburov
Привет, мне тоже очень приятно к вам заглянуть. По поводу StringTokenizer - я имела ввиду не саму функцию, а весь класс StringTokenizer, в нём есть 6 функций. Я не вникала особо в их описание, но если кто захочет - пишите. |
|||
|
||||
| Bors |
|
|||
|
Unregistered |
У Апаче.орг - есть для явы парсер регуляр експрешенс - воспользуися им
Синтаксис напоминает перль http://jakarta.apache.org/regexp/index.html |
|||
|
||||
| ElectricalStorm |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: 5 Всего: 9 |
Ни чуть не бывало ! вот прример который сравниват пароли по их звучанию (правда на Perl
-------------------- Нужно знать инструмент, которым пользуешься |
||||
|
|||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
xaoc2
Нет, не то... Эта вещь полезна когда есть регекспы, но нет (по непонятным причинам) функции сравнения строк без учета регистра. Светлая Токенайзер тоже не то AntonSaburov Задам, наверное, в алгоритмах еще Bors Насколько я понимаю - это старый пакет. С 1.4 есть java.util.regex. Он будет использоваться, но только для подготовки аргументов к дальнейшему сравнению. ElectricalStorm Зачем сравнивать пароли по звучанию? Сложности в сравнении: Разные регистры символов - решается (обе строки перед сравнением toUpperCase()) В русских словах пишут английские буквы (могут и ноль написать вместо буквы "О") и наоборот - решается (выше описано как) Путают прямой/обратный слэши, кавычки/апострофы - решается (замена обр. слэшей на прямые, апострофы с кавычками вообще убираются) Слова разделяют произвольным числом пробелов - решается (замена "\\s+" на " " в терминах regexp) Ставят пробелы в конце и в начале названия - решается (пробелы в конце и в начале названия убиваются, если есть) Жестоко сокращают слова (д/инф д/проф-ки п/о) - требует решения... |
|||
|
||||
| 3,14 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1614 Регистрация: 18.6.2004 Где: Н. Новгород Репутация: 6 Всего: 24 |
В принципе как проверить похожи слова или нет обсуждалось недавно в Алгоритмах, думаю запрограммить готовый алгоритм будет не сложно: http://forum.vingrad.ru/index.php?showtopic=31253
-------------------- Может быть, это только мой бред, Может быть, жизнь не так хороша, Может быть, я не выйду на свет, Но я летал, когда пела душа... |
|||
|
||||
| Bors |
|
|||
|
Unregistered |
Zandar
Есть такой пакет, но он достачно слабенький. Он ищет простые мэчи , но не более того. Что запарсить сложный текест - на мой взгляд лучше пользоваться апачевским регэкспом. |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Могу только подтвердить - апачевский может больше. |
|||
|
||||
| Bors |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 27.10.2004 Где: Israel Репутация: нет Всего: нет |
На базе регэкспа как-то писал симулятор для WAPa и SMSa. Так там надо было парсить и URLи и собственно сообщения. Возможности просто гиганские, если хорошо разбираешься в паттеренах регэкспа... |
||||
|
|||||
| Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Короче. MSWord. Печатаем слово с ошибкой. MSWord предлагает список "правильных" слов из которого можно выбрать замену. Вот похожий по смыслу алгоритм мне нужен. Только не для одиночных слов, а для наименований, которые есть выше. Уже есть ключевые наметки как это сделать. Некоторые из них описаны выше. Половина (если не больше) преобразований есс-но на регекспах. Но ими одними не обойтись. Как доделаю выложу для дальнейшего обсуждения.
Добавлено @ 11:17
Мдя |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |