none
Determinar el nivel de similitud de dos strings VB.NET RRS feed

  • Pregunta

  • Que tal amigos estoy trabajando en Visual Studio 2008 VB.NET

    alguno podría indicarme como puedo realizar un nivel de similitud de dos cadenas de texto?

    Ej:

    "Hola Mundo" - "Hola mund" 

    En esta instrucción el nivel de similitud seria como de un (98%). Como puedo deducir que la comparación de esas dos cadenas tienen un alto grado en que se asemejan? 

    Ej:

    "George Albert Smith" - "George Albert smit"

    El problema es que tengo que comparar el texto que ingresen los usuarios a un textbox, y luego realizar una comparación contra el nombre que yo ya tengo almacenada en una variable.

    Agradezco su apoyo. saludos.


    crossvi.gonzalez


    lunes, 5 de febrero de 2018 17:57

Respuestas

Todas las respuestas

  • hola

    lo que buscas se conoce como

    Damerau–Levenshtein distance

    hay varias librerias que permiten implementarlo

    StringSimilarity.NET

    aunque no veo muchas implementaciones en vb.net, si hay muchas en c#

    How to calculate distance similarity measure of given 2 strings?

    quizas se podrian tomar de base para convertir el codigo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 5 de febrero de 2018 18:15
  • Gracias leandro, estare revisando los enlaces y tratare de desarrollarlo, si logro hacerlo subire los cambios. Saludos!

    crossvi.gonzalez

    lunes, 5 de febrero de 2018 18:18
  • Hola Crossvi, mirá, sin pensarlo mucho se me ocurre que puedes primero, contar las palabras separadas por espacios vaciós, si coincide el número proceder a contar las letas y luego hacer una comparación por letra.. el porcentaje (número) no sería dificil.

    Escribe si necesitas código..

    Saludos

    • Propuesto como respuesta Pablo Rubio miércoles, 7 de febrero de 2018 19:09
    martes, 6 de febrero de 2018 18:52
  • Que tal amigo, si te comento que estuve desarrollando el codigo segun el metodo de Levenshtein distance y funciona muy bien retorna lo que necesito:

    Protected Sub btn_buscarnombre_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btn_buscarnombre.Click
            Dim Nombre As String = "George Smith"
            Dim NombreIngresado As String = Convert.ToString(txt_ingreso.Text)
            Dim porcentaje As Integer = Levenshtein(Nombre, NombreIngresado)
    
        End Sub
    
        Public Function Levenshtein(ByVal s1 As String, ByVal s2 As String) As Integer
            Dim coste As Integer = 0
            Dim n1 As Integer = s1.Length
            Dim n2 As Integer = s2.Length
            Dim m As Integer(,) = New Integer(n1, n2) {}
            For i As Integer = 0 To n1
                m(i, 0) = i
            Next
            For i As Integer = 0 To n2
                m(0, i) = i
            Next
            For i1 As Integer = 1 To n1
                For i2 As Integer = 1 To n2
                    coste = If((s1(i1 - 1) = s2(i2 - 1)), 0, 1)
                    m(i1, i2) = Math.Min(Math.Min(m(i1 - 1, i2) + 1, m(i1, i2 - 1) + 1), m(i1 - 1, i2 - 1) + coste)
                Next
            Next
            Return m(n1, n2)
        End Function

    Ahora bien lo que retorna en la variable porcentaje, es la cantidad (en numero entero) de las diferencias que encontró o mas bien los cambios que se requieren para poder ser idénticos del nombre del sistema (George Smith), y el nombre ingresado por el usuario.

    estaba pensando que si "George Smith" tiene 11 letras 

    11 equivale a mi 100% de validación.

    si yo ingreso "george smith" (En minusculas)

     me retorna en mi variable de porcentaje un 2?

    ese 2 a cuanto equivaldría de mi 100% de 11?. creo que alli estaria la solucion a mi problema.


    crossvi.gonzalez


    miércoles, 7 de febrero de 2018 20:31
  • al compararlo has un upper o un lower al string para evitar esto.

    Si necesitas ayuda sube tu avance de otro modo no puedo ayudarte , Suerte!

    miércoles, 7 de febrero de 2018 20:33
  • Que tal dane, mira te mostrare como esta:

    Ingreso de nombre en la pagina web.

    variable nombre original del cliente

    variable nombre ingresado desde la pagina web

    Aca podemos observar que el pagina web ingrese "eorge smith" falta la "G" llamo ala función Levenshtein distance y me retorna la diferencia encontrada entre el nombre original y el nombre ingresado en este caso la diferencia o los cambios que se necesitarían para ser identicos es "1".

    Es en este punto donde yo necesito validar que tanta similitud tienen los dos nombres por lo menos tendria que tener el 80% de similitud para saber que el nombre esta correcto.


    crossvi.gonzalez



    miércoles, 7 de febrero de 2018 21:07