![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Есть ряд фраз. Необходимо найти похожие фразы, которые стоят рядом друг с другом.
Я выбрал их вручную и выделил жирным шрифтом. Можно ли сделать подобное с помощью Perl? Какие алгоритмы можете подсказать. обращение с отходами потребления органы управления в области садоводства оформление прав собственности на землю оценка земель садоводческих объединений право на ведение садоводства предоставление земли для ведения садоводства предоставление земли для садоводства предоставление земля для ведения личного подсобного хозяйства предприятие развития Московского региона строительные нормы и правила СНиП программы развития садоводства программы по развитию садоводства фонды проката Это сообщение отредактировал(а) Suppir - 22.9.2011, 10:49 |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Подумал, может быть следующим способом:
1) исключаем все союзы и предлоги (и, а, но, по, не, для и т.п.), знаки препинания, переводим в нижний регистр 2) разбиваем фразу на массив слов ('предоставление', 'земли', 'ведения', 'садоводства') 3) теперь хорошо бы привести все элементы массива в именительный падеж 4) потом проверяем количество совпадающих слов между каждыми соседними фразами |
|||
|
||||
alezzz |
|
||||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
Для ангиского есть несколько алгоритмов, с русским сложнее. Я пробовал адаптировать soundex под русский язык, получилось конечно не очень, но поделюсь опытом. Что такое soundex можно погуглить.
Удаляю все предлоги (или почти все, может забыл что-то) и кодирую слова, в результате получается такое:
Видно что строки: программы развития садоводства программы по развитию садоводства одинаковы, а вот строки: предоставление земли для ведения садоводства предоставление земли для садоводства немного отличаются, но можно посчитать процент совпадения. Вобщем вот такая заготовка, если нравится то модернезируйте ее на свое усмотрение. Пишут что для русского языка больше подходит аглоритм Metaphone, можно попробовать его. |
||||
|
|||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Спасибо, попробую!
|
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Попробовал. Soundex конкретно для моего случая мало подходит :( много лишних совпадений получается.
|
|||
|
||||
ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Suppir, я попробовал два модуля с CPAN: String::Similarity и String::Trigram
код
результат
может поможет -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Сейчас потестю
![]() |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
До кучи еще можно расстояние Левенштейна определить (Text::LevenshteinXS):
Это сообщение отредактировал(а) ginnie - 22.9.2011, 15:23 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
Расстояния Левенштейна иногда использую. С помощью него хорошо искать опечатки (разницу в 1-3 буквы), вроде:
программы по развитию садоводства программы но развитию садоводства Но при этом невозможно применять в таких случаях: программы по развитию садоводства программы по развитию частного садоводства потому что если учитывать разницу в 5 и более букв, то будет очень много лишнего находиться. Добавлено @ 16:00 Сейчас передо мной стоит следующая частная задача. Есть два массива: @a = ('мама', 'мыла', 'раму'); @b = ('мама', 'помыла', 'раму'); Необходимо подсчитать степень соответствия между двумя массивами. При этом нужно учитывать: 1) количество одинаковых слов <разделить на> общее количество слов //это легко, сам могу ![]() 2) правильность порядка слов в массивах //это не получается ![]() Подскажите, плиз Это сообщение отредактировал(а) Suppir - 22.9.2011, 16:00 |
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
А что такое "правильность порядка слов в массивах"?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Все эти модули оперируют на уровне символов или их последовательнстей, что в данном случае не очень полезно.
Наиболее очевидным вариантом кажется уже предложенный алгоритм: убрать стоп-слова, нормализовать (в т.ч. словоформы), отсортировать (?), сравнить. -------------------- Died at Life.pl line 21 |
|||
|
||||
Suppir |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 588 Регистрация: 20.4.2009 Репутация: нет Всего: нет |
А что такое "правильность порядка слов в массивах"?
Вот что: Если @a = ('мама', 'мыла', 'раму'); @b = ('мама', 'помыла', 'раму'); то здесь повторяются "мама" и "раму". Они занимают одинаковые позиции (0 и 2 элемент массива). Если @a = ('мама', 'мыла', 'раму'); @b = ('помыла', 'мама', 'раму'); то здесь повторяются "мама" и "раму". НО здесь только слово "раму" занимает одинаковую позицию. Поэтому степень совпадения двух массивов должна быть меньшей, чем в первом случае. При этом, перед тем как подсчитывать позиции, необходимо исключить из массива не совпадающие слова (для которых нет совпадений). Иначе получим следующее: @a = ('сегодня', 'мама', 'мыла', 'раму'); @b = ('мама', 'мыла', 'раму'); По первой проверке имеем всего лишь одно лишнее слово "сегодня". Но из-за того, что это слово "сдвинуло" всю цепочку, по второй проверке (на правильность порядка) мы получим полное несоответствие (1 != 0, 2 != 1, 3 != 2). Поэтому перед второй проверкой нужно исключать слова, у которых нет соответствий. Это сообщение отредактировал(а) Suppir - 22.9.2011, 16:26 |
|||
|
||||
alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 1 Всего: 14 |
||||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
KSURi, как ты предлагаешь модифицированные строки сравнить?
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
KSURi |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 887 Регистрация: 8.6.2006 Где: Russia Репутация: 20 Всего: 27 |
Модифицированные это в смысле разные словоформы? Если да, то я упомнул, что их надо нормализовать — лемматизировать.
Иначе не понятно, что имелось в виду. -------------------- Died at Life.pl line 21 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |