Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Интеллектуальный ВПР (сопоставление ПОХОЖИХ текстов) [Konstantin_]
 
[Konstantin_]
Во вложении пример с собственной польз. функцией для сопоставления двух списков в при неточном соответствии написания.

Аргументы функции:
Искомое_значение - что искать (как Range - одна ячейка)
Словарь - массив в котором ищем соответствие (Range - несколько ячеек)
Значение_или_индекс - резульата работы функции (Boolean 0 или 1) - возвращает или строку Максимально соответсвующую искомой или индекс максимального сооотвествия)
Прцент_совпадения (Long) - минимальный индекс соотвествия при котором возвращает строку (иначе возвращает MISS) необязателный параметр (по умолчанию 50 т.е. 50%)
Минимальная_длинна_слова (Long) игнорировать при анализе слова кол-во знаков в которых меньше или равно аргументу (не обязательный аргумент)
Слова_исключения - список "масок" слов, которые будут проигнорированны при анализе. Список через ";" (маска1;маска2;маска3)

Фкнкция сильно ускоряет составление словарей для разных списков (например прайсов из разных источников)
Может еще кому пригодится
 
[слэн]
до конца не разобрался, но интересно..

функцию replacepuctuation

я бы заменил на нечто такое:

Код
Func tion repunct$(str$)
Dim c$, r, r2, i&
r = Array(0, 33, 48, 58, 65, 91, 97, 123, 127)
r2 = Array(45, 47, 95)
On Error GoTo er
For i = 1 To Len(str)
c = Mid(str, i, 1)
If WorksheetFunction.Match(Asc(c), r2, 0) Then repunct = repunct & " "
nxt: Next
Exit Function
er: If WorksheetFunction.Match(Asc(c), r) Mod 2 Then repunct = repunct & c
Resume nxt
End F unction
один проход вместо тридцати..

массивы r и r2 можно задать глобально..
Изменено: Юрий М - 16 Сен 2012 02:13:28
 
Возможно, просто нашел первую попавшуюся

Работает примерно так: берет слово из первой фразы и начинает сравнивать со всеми словами из второй фразы потом слово потом в обратном порядке и вычисляет среднее совпаддение

Иван Иванов - т.е слово Иван совпадает с Ивановым на 100% Иванов с Иван совпадает примерно на 80% в среднем слова совпадают на 90% процентов (познаково)
Слова с макс. коэфф совпадения удаляются из дальнейшего анализа.
Процент вычисляется как процент от максимально возможного коэффициента.
Алгоритм не претендует на оптимальность и уж тем более на скорость. Но с моими задачами она справляется.

Можно и глобально, все началось с маленькой функции посимвольного сравнения а разраслось до такого. Щас я уже сам не в полне понимаю, как оно работает :-)
 
[слэн]
я и не то, чтобы критикую..
просто предлагаю :)
 
[The_Prist]
Кстати, по поводу repunct$. А регулярные выражения не быстрее будут?

Код
Function RelacePunct$(sStr As String)
Dim objRegExp As Object 'As RegExp

Set objRegExp = CreateObject("VBScript.RegExp")
'или раннее связывание, что будет побыстрее работать.
'Set objRegExp = New RegExp
'Но необходимо добавить ссылку на библиотеку
'Microsoft VBScript Regular Expressions Х.Х в Tools-References

objRegExp.Global = True: objRegExp.IgnoreCase = True
objRegExp.Pattern = "[\_,\-,\/]"
sStr = objRegExp.R eplace(sStr, " ")
objRegExp.Pattern = "[\!,\@,\#,\$,\%,\^,\&,\*,\(,\),\+,\=,\{,\},\[,\],\|,\\,\;,\:,\',\"",\<,\.,\,,\?,\`,\~]"
RelacePunct = objRegExp.R eplace(sStr, "")
End F unction
Изменено: Юрий М - 16 Сен 2012 02:17:43
 
[Alex_ST]
Тема зацепила.
Очень хорошо было бы подвести под нечёткий поиск новые алгоритмы такого поиска.
Ведь здорово же работает нечёткий поиск в Интернет-поисковых системах...
Поискал чуть-чуть на досуге.
Наткнулся на интересный сайт, специально посвященный информационному поиску (information retrieval) и поиску по сходству (fuzzy searching). http://itman.narod.ru/
А вообще-то Гугл по запросу "алгоритм нечеткого поиска" выдаёт массу информации.
Жалко, что ни времени нет в алгоритмах копаться, ни квалификации не хватит чтобы выбранный алгоритм на VBA Excel реализовать...
 
[Alex_ST]
И ещё нашел хорошую статью "Нечёткий поиск в тексте и словаре" на http://habrahabr.ru/blogs/algorithm/114997/
вроде бы прилично написано, но пытаться реализовать даже самый простой из методов точно не смогу...
 
[Alex_ST]
А ещё на SQL-форуме http://www.sql.ru/forum/actualthread.aspx?tid=87673 нашёл пример VB-кода (выложил в примере), но не могу понять, как его заюзать чтобы потестировать :-(
А Дельфисты обсуждают методы примерного поиска в статье "Еще раз о нечетком сравнении строк" на http://www.delphisources.ru/pages/faq/base/compare_strings2.html
Изменено: Юрий М - 16 Сен 2012 02:24:54
 
[Konstantin_]
Я все это читал, до того как начал функцию ваять. Функцию писал в очень сжатые сроки. Но кучу времени она мне уже сэкономила. Если найдется что то более функциональное с удовольствием воспользуюсь. так что если что то попадется, то не забудьте поделится.

P/s в моем варианте за счет "исключений" и процента совпадений получается очень неплохой результат. из 100 ФИО - 3-4 ошики.
 
[Alex_ST]
Konstantin_,
а почему у вас только мЕньшая часть знаков пунктуации в стринге при анализе заменяется на пробел - разделитель слов?
По логике, вроде бы надо как раз практически все знаки пунктуации заменять на пробелы, т.к. вероятность того, что эти знаки введены случайно вместо букв достаточно мала ввиду того, что бОльшую часть из них приходится вводить с шифтом.
Так что знаки пунктуации скорее всего нужно заменять при анализе на пробелы.

К стати, я попробовал тупо все знаки препинания заменять на пробелы и ИМХО, качество распознавания фамилий стало намного лучше.
Я пробовал в образцах задавать Кузнецов Пётр и Кузнецов Алексей
А распознавал А.Кузнецов, А. Кузнецов, Кузнецов А., П.Кузнецов, П. Кузнецов, Кузнецов П.
 
Последняя версия функции: http://pharmaprofi.ru/post/26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Читают тему (гостей: 1)