PDA

View Full Version : Сравнивание Стрингов


CyberJoe
Nov 11, 2004, 10:10
Вобщем требуется мне алгоритм функции которая будет получать в качестве параметров, два стринга, и возвращать цифру их "похожести"
в процентном соотношении, ну типа хотя бы алгоритм.

Obelix
Nov 11, 2004, 13:08
Детка, ты определись, что ты понимаешь под похожестью? Есть понятие расстояния стрингов (дасиц кич трнеир киманаир), этого тебе нада?

Agregat
Nov 11, 2004, 13:13
например strcmp :) 0 если совсем похожи 1/-1 ежели одна меньше/больше другой.А фактически да - скажи параметр похожести, там придумаем, что надо.

CyberJoe
Nov 11, 2004, 13:51
Ну как бы сказать вам.
Вот есть у меня несколько прайс листов с наименованиями лекарств.
Но в каждом прайсе все написанно по разному, для примера:
анальгин 25, Анальгин 25, Анальгин. 25., Анальгин mg25, Анальгин 25 мг.
и.т.д
Так вот мне надо как бы ну опознать "Анальгины", Аспирины и всякую мурню.

CyberJoe
Nov 11, 2004, 13:52
И я не могу юзать strcomp, так как не на C++ вояю, так что алгоритм бы.

Agregat
Nov 11, 2004, 13:58
lstrcmp(i) - системные функции виндоза.
0. Sum = 0;
1. по очереди проходишь по всем символам сравниваешь их , если равны + 2. если равны, но без учета регистра +1 (тут я поправил)
3. пробелы не сравниваешь вообще - пропускаешь (пробел, верт и гор
табуляция, перевод строки, возврат каретки)
4. несовпадения вычитаешь :)
смотришь число...
или же:
берешь и ищещь слова из одной строки в другой без учета регистра... похожесть сумма похожих чисел чем больше тем лучше...

Pascal
Nov 11, 2004, 14:23
Я подозреваю, что надо смотреть в направлении либо:

SOUNDEX(str) Returns a soundex string from str. Two strings that sound almost the same should have identical soundex strings. A standard soundex string is four characters long, but the SOUNDEX() function returns an arbitrarily long string. You can use SUBSTRING() on the result to get a standard soundex string. All non-alphabetic characters are ignored in the given string. All international alphabetic characters outside the A-Z range are treated as vowels. mysql> SELECT SOUNDEX('Hello');
-> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'
Note: This function implements the original Soundex algorithm, not the more popular enhanced version (also described by D. Knuth). The difference is that original version discards vowels first and then duplicates, whereas the enhanced version discards duplicates first and then vowels.
Либо смотреть здесь http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html на предмет Score.

CyberJoe
Nov 11, 2004, 15:45
А Если будет так:
Aspirin 25mg
25mg Aspirin

???

Да и Алгоритм должен быть быстрым, ведь таких стрингов будет 10000.

Obelix
Nov 11, 2004, 16:21
А Если будет так:
Aspirin 25mg
25mg Aspirin

???

Да и Алгоритм должен быть быстрым, ведь таких стрингов будет 10000.
Может тебе еще исскуственный интеллект?

Ablertus
Nov 11, 2004, 16:24
В биоинформатике есть понятие - sequence alignment. Алгоритмы Needleman-Wunsch (global SA), Smith-Waterman (local SA)

CyberJoe
Nov 11, 2004, 16:29
Может тебе еще исскуственный интеллект?
Ну если тебе не сложно :D
ДА ладно, все же не так это сложно, (зато сколько дадут бабосов)

Pascal
Nov 11, 2004, 16:38
А Если будет так:
Aspirin 25mg
25mg Aspirin

???

Да и Алгоритм должен быть быстрым, ведь таких стрингов будет 10000. Full-text search v mysql bystriy.
I tvoi primery budut naydeny.

Pascal
Nov 11, 2004, 16:45
Odnako ideala ty vse ravno ne naydesh - poetomu stoit predusmotret' nekiy variant opredeleniya etikh parametrov vruchnuyu.
I tol'ko posle etogo nachat' sravnivat' realizatsii na "zhivykh sluchayakh"

CyberJoe
Nov 11, 2004, 16:53
Думаю может просто сделать базу из всех имен вручную, а потом уже просто ее юзать...
но сделать базу из 1000 наименований... мдя...

gaglik
Nov 11, 2004, 18:02
you can use a dynamic programming algorithm to find the longest common substring (I think ignoring cases and spaces might be a good idea), then in the aspirin example you'll find "aspirin".
I think this will do the main part of the work.

Agregat
Nov 11, 2004, 20:59
Может тебе еще исскуственный интеллект?
надо смотреть именно в этом направлении.

analyst
Nov 12, 2004, 04:17
Че Ав джан, чстацвав, ВБ-ум исскуственни интелекты компонент чка ашкис....

Obelix
Nov 12, 2004, 11:47
>Agregat
Хе, молодежь наставляешь :D

>analyst
Դե դեռ հույս կա որ API ում տենց ֆունկցիա ըլնի:

CyberJoe
Nov 13, 2004, 07:44
>analyst
Де нсти модули гри. я тебя доллар дам :P

Agregat
Nov 13, 2004, 10:08
>analyst
Де нсти модули гри. я тебя доллар дам :Pэх... молодежь пошла книжет не читает.

Вирус
Nov 17, 2004, 14:09
я думаю имеет смысл сравнивать не символы а последовательности без учета регистра, пробелов и т.д.. Этот алгоритм конечно будет ворочаться дольше простого посимвольного сравнения, но, иногда цель оправдывает средства.

CyberJoe
Nov 17, 2004, 17:46
А если так.
Просто взять все слова из текста, и сравнивать их со словами из другого текста, без учета очередности слов, регистра, точек, и пробелов.
тогда:
Analgin 10mg N50
и
ANALGIN N50 10MG
будут идентичны.

Agregat
Nov 17, 2004, 20:33
А если так.
Просто взять все слова из текста, и сравнивать их со словами из другого текста, без учета очередности слов, регистра, точек, и пробелов.
тогда:
Analgin 10mg N50
и
ANALGIN N50 10MG
будут идентичны.ТОгда можно сделать по другому
получить массивы слов из первой и второй строчки. отсортировать их и сравнивать. при этом можно сравнивать двояко - учитывая регистр и не учитывая. Если совпадают с регистром - это ближе, чем если совпадают без регистра. Итак. Для каждого слова из первого (уже отсортированного массива) находим его место во втором массиве - сравниваем с элементами на данной позиции: если слова равны +2, если равны без учета регистра +1, если такого слова нет -1 или 0. Потом для всех неиспользованных слов из второго массива -1 или 0. Чем больше число тем похоже строки

CyberJoe
Nov 17, 2004, 21:29
Это уже дело :)

Agregat
Nov 18, 2004, 09:18
Это уже дело :)Одного, я не понимаю, почему я за тебя должен думать. ПОделишься баблом.

CyberJoe
Nov 19, 2004, 10:04
Я не жадный, будет бабло, поделюсь.

Н.К.Рерих
Nov 27, 2004, 12:22
Не люблю я стринги! :)

Obelix
Nov 27, 2004, 12:39
Не люблю я стринги! :)
Особенно Си стринги, чэ? Я тоже их не люблю.

Н.К.Рерих
Nov 28, 2004, 23:03
Ага!

Agregat
Nov 29, 2004, 06:21
Чят закончили.

[ Xelgen ]
Dec 20, 2004, 03:37
Чят закончили.
..раз уж сделка не состоялаcь? :)

Аво, верджы дра такиц вонц дурс екар?

CyberJoe
Dec 28, 2004, 07:25
Xelgen>Я написал отдельную прогу в которая составила моими руками.
Базу типа
Аспырын Асяприн Аспутин 1
Анальгин Анылгин анальгин 2
... и.т.д

а потом прогу которая с ютой базой работала, оказалось что комбинаций в прайс листах только 14 атк что на каждое лекарство по 14 вариантов.... вот так вот