Различие текста

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Различие текста

Сообщение Demonx » 07.09.2007 (Пт) 17:51

Есть два почти одинаковых текста в двух переменных, в одном из которых есть некоторое отличние (т.е пару там слов не таких). Как узнать различие в процентах между этими двумя текстами (т.е. много или мало поменялось, в процентах)?
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.09.2007 (Пт) 17:54

тут тебе поможет высшая математика, раздел статистики и вероятности. поищи алгоритмы похожести

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 07.09.2007 (Пт) 17:57

а готового кода нигде не встречал?
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.09.2007 (Пт) 18:08

Я где-то находил такую функцию на vb...
Лучший способ понять что-то самому — объяснить это другому.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 07.09.2007 (Пт) 21:27

Найдешь, скинь ссылку, мне чувствую в ближайшее время понадобится проверять текст на совпадение, но не жесткое а так.. плюс мину пара символов.
Утро добрым не бывает!

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 07.09.2007 (Пт) 21:36

А строки большие? Как насчет тупо сравнить строки посимвольно в цикле, и если символы не совпадают, то инкрементировать счетчик "несовпадений", а затем разделить значение этого счетчика на длину строки и это будет число, на какую часть отличаются строки, которое можно будет потом перевести в проценты и т.д.
Подпись проходит рефакторинг

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.09.2007 (Пт) 23:39

если бы было так просто 8)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 08.09.2007 (Сб) 7:15

Первая ссылка в гугл по запросу "Неточное сравнение строк"

Которую надо было вставить правильно, чтобы топик не разъезжался. --GSerg
А я все практикую лечение травами...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.09.2007 (Вс) 18:54

Еще это.

gjghjc
Эту функцию я скопировал в текстовый файл, который теперь не могу найти.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.09.2007 (Вс) 20:13

Lumen
что насчёт сравнения твоим способом сток "фууубар!" и "фуубар!" ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 09.09.2007 (Вс) 22:12

Antonariy
Если не трудно, поищи, пожалуйста.
А то что выложено по ссылке вроде походе на то что нужно.
Утро добрым не бывает!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 10.09.2007 (Пн) 19:59

Нашел таки. В файле с юмором. :D
Умножь возвращаемое значение на 100 и получишь проценты.
Код: Выделить всё
Private b1() As Byte
Private b2() As Byte

Public Function Simil(String1 As String, String2 As String) As Double
Dim l1 As Long
Dim l2 As Long
    If UCase(String1) = UCase(String2) Then
        Simil = 1
    Else
        l1 = Len(String1)
        l2 = Len(String2)
        If l1 <> 0 And l2 <> 0 Then
            b1 = StrConv(UCase$(String1), vbFromUnicode)
            b2 = StrConv(UCase$(String2), vbFromUnicode)
            Simil = SubSim(1, l1, 1, l2) / (l1 + l2) * 2
        End If
    End If
    Erase b1
    Erase b2
End Function

Private Function SubSim(st1 As Long, end1 As Long, st2 As Long, end2 As Long) As Long
Dim c1 As Long
Dim c2 As Long
Dim ns1 As Long
Dim ns2 As Long
Dim i As Long
Dim max As Long
    If st1 > end1 Or st2 > end2 Or st1 <= 0 Or st2 <= 0 Then Exit Function
    For c1 = st1 To end1
        For c2 = st2 To end2
            i = 0
            Do Until b1(c1 + i - 1) <> b2(c2 + i - 1)
                i = i + 1
                If i > max Then
                    ns1 = c1
                    ns2 = c2
                    max = i
                End If
                If c1 + i > end1 Or c2 + i > end2 Then Exit Do
            Loop
        Next
    Next
    max = max + SubSim(ns1 + max, end1, ns2 + max, end2)
    max = max + SubSim(st1, ns1 - 1, st2, ns2 - 1)
    SubSim = max
End Function
Исправленному верить :)
Последний раз редактировалось Antonariy 11.09.2007 (Вт) 15:03, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 10.09.2007 (Пн) 21:56

Antonariy
Спасибо тебе, добрый человек.
Сейчас сохраню себе и буду разбираться как работает :)
Утро добрым не бывает!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.09.2007 (Вт) 8:15

Antonariy, а я вначале подумал было, что функция будет сравнивать строки с учетом схожести букв :)
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.09.2007 (Вт) 9:39

alibek
Это ты на SpamCutter намекаешь? :)
Лучший способ понять что-то самому — объяснить это другому.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 11.09.2007 (Вт) 13:29

Antonariy
Вызываю MsgBox Simil("aaabc", "aaaacb") - ошибка Subscript out of range
Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 11.09.2007 (Вт) 13:51

Он же написал, что это не его алгоритм, а найденный. Посмотри сам, почему не работает.
label:
cli
jmp label

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 11.09.2007 (Вт) 15:02

Прошу прощения, я заменил циклы, в которых строки превращались в массивы на StrConv и не заметил, что нижняя граница массива была 1. :oops:
Нужно написать Do Until b1(c1 + i - 1) <> b2(c2 + i - 1)
Лучший способ понять что-то самому — объяснить это другому.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 11.09.2007 (Вт) 17:08

Спасибо, работает 8)
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList