Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Psyke1

#991
Hola a todos, os presento mi utlima funcion : Check_Similar_Words



  • ¿Que hace?
    Busca palabras similares en una cadena de texto, obtendrias un resultado similar al tipico de Google : "Quizas quiso decir... "

  • ¿Como funciona?
    Lo que hace es alamcenar en un array todas las palabras que encuentre en la cadena a analizar, una vez aqui, descompongo la palabra que se busca en las partes correspondientes a el número de coincidencias que queramos buscar, os voy a poner un ejemplo:
    Supongamos que se desea buscar la palabra "mañana", y indicamos a la funcion que busque palabras similares con 3 coincidencias, entonces se partiria la palabra a buscar de esta manera:
Citarmañ
aña
ñan
ana
La formula para sacar el numero de fragmentos es esta:


(x - n) + 1

Donde x es la cantidad de digitos de la palabra y n los digitos en los que se quiere separar esa palabra... :D

Comprobaria si las palabras de la cadena contienen algunos de estos trozos y las guarda en mi Collection.
Lo divertido es que segun el número de coincidencias que pongamos, la busqueda sera mas o menos estricta. :laugh:

  • Bueno aqui os dejo el codigo:

Código (vb) [Seleccionar]

'==================================================================================================
' º Function  : Check_Similar_Words
' º Version   : 1.2
' º Author    : Mr.Frog ©
' º Country   : Spain
' º Mail      : vbpsyke1@mixmail.com
' º Twitter   : http://twitter.com/#!/PsYkE1
' º Recommended Websites :
'       http://visual-coders.com.ar
'       http://InfrAngeluX.Sytes.Net
'==================================================================================================

Option Explicit
Option Base 0

Private Declare Function lstrcmpi Lib "kernel32" Alias "lstrcmpiA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

Public Function Check_Similar_Words(ByVal sStringToAnalyze As String, ByVal sWord As String, ByVal bvComparationLevel As Byte) As Collection
Const sNullChars                                                            As String = ".,"
Dim cTemp                                                                   As New Collection
Dim sCompareWord()                                                          As String
Dim sTextWord()                                                             As String
Dim sActualWord                                                             As String
Dim lTotalCompWords                                                         As Long
Dim lTotalWords                                                             As Long
Dim lLenWord                                                                As Long
Dim Q                                                                       As Long
Dim G                                                                       As Long
   
   If CBool(bvComparationLevel) Then
       lLenWord = Len(sWord)
       If (lLenWord > 2) And (Len(sStringToAnalyze) > lLenWord) Then
           If (bvComparationLevel < lLenWord) Then
               If Not (InStrB(sWord, vbNewLine)) Then
                   G = 1
                   
                   lTotalCompWords = (lLenWord - bvComparationLevel) + 1
                   ReDim sCompareWord(lTotalCompWords) As String
                   
                   Do Until Q = lTotalCompWords
                       sCompareWord$(Q) = Mid$(sWord, G, bvComparationLevel)
                       G = G + 1
                       Q = Q + 1
                   Loop
                   
                   sStringToAnalyze = Replace$(sStringToAnalyze, vbNewLine, Space$(1))
                   sTextWord() = Split(sStringToAnalyze, Space$(1))
                   
                   lTotalWords = UBound(sTextWord)
                   lTotalCompWords = lTotalCompWords - 1
                   
                   For Q = 0 To lTotalWords
                       sActualWord = sTextWord(Q)
                       If Len(sActualWord) >= bvComparationLevel Then
                           For G = 0 To lTotalCompWords
                              If CBool(lstrcmpi(sWord, sActualWord)) Then
                                   If InStrB(1, sActualWord, sCompareWord(G), vbTextCompare) Then
                                       If InStrB(sNullChars$, Right$(sActualWord, 1)) Then
                                           sActualWord = Left$(sActualWord, Len(sActualWord) - 1)
                                       End If
                                       On Error Resume Next
                                       cTemp.Add sActualWord, sActualWord
                                   End If
                               End If
                           Next G
                       End If
                   Next Q
                   
                   Set Check_Similar_Words = cTemp
               End If
           End If
       End If
   End If
End Function


  • Un ejemplo práctico:

    Tengo en un TextBox(llamado Text1) esto:
    Citar
    La inspiración de Cervantes para componer esta obra vino, al parecer, del llamado Entremés de los romances, que era de fecha anterior (aunque esto es discutido). Su argumento ridiculiza a un labrador que enloquece creyéndose héroe de romances. El labrador abandonó a su mujer, y se echó a los caminos, como hizo Don Quijote. Este entremés posee una doble lectura: también es una crítica a Lope de Vega; quien, después de haber compuesto numerosos romances autobiográficos en los que contaba sus amores, abandonó a su mujer y marchó a la Armada Invencible. Es conocido el interés de Cervantes por el Romancero y su resentimiento por haber sido echado de los teatros por el mayor éxito de Lope de Vega, así como su carácter de gran entremesista. Un argumento a favor de esta hipótesis sería el hecho de que, a pesar de que el narrador nos dice que Don Quijote ha enloquecido a causa de la lectura de libros de caballerías, durante su primera salida recita romances constantemente, sobre todo en los momentos de mayor desvarío. Por todo ello, podría ser una hipótesis verosímil. A este influjo se agregó el de Tirante el Blanco de Joanot Martorell, el del Morgante de Luigi Pulci y el del Orlando Furioso de Ludovico Ariosto.

    Para ver un ejemplo:
Código (vb) [Seleccionar]

Private Sub Form_Load()
   Dim vItem         As Variant

   Debug.Print "--------------->"; Time$
   For Each vItem In Check_Similar_Words(Text1.Text, "argumento", 4)
       Debug.Print vItem
   Next vItem
End Sub


Y obtengo esto:
Citar
Entremés
numerosos
resentimiento
entremesista
constantemente
momentos

En cambio si en vez de 3 pongo 4 en la llamada la busqueda de palabras similares se vuelve más extricta y obtendria esto:
Citar
resentimiento
constantemente
momentos

Espero que os haya gustado! :-*

Salu2! :P
#992
Gracias tio! es parecido a lo que habia pensado yo... ;)
Cita de: raul338 en  2 Junio 2010, 00:56 AM
Como estas insistente con las expresiones regulares en los ultimos tiempos xDDDD
JAJAJAJAJAJA  :laugh:
No se, tienen pinta de ser muy utiles... :P

Salu2!
#993
Ya lo vi Balck, pero esque me parecia un poco complicado, no obstante lo intentare con Expresiones Regulares a ver que tal... :P

Gracias! ;D
#994
Hago esto:
Código (vb) [Seleccionar]

    Dim a() As String
    a() = Split(",.)(=/&%%?¿¡!#@¨><:;t_-\|{}^[]*+·ªº", "")
    For x = 0 To UBound(a())
        Text1.Text = Replace(Text1.Text, a(x), "")
    Next

Que te parece?¿  :huh:

Salu2! ;)
#995
Yo duermo entre 4 y 5, pero con 2 horas al dia no aguantas mucho tiempo... :-\
#996
Cita de: shellroot@alex-laptop:~$ en  1 Junio 2010, 18:08 PM
Osea lo preguntaba, ya que podes validar eso, desde el momento en que se haga el input de la cadena, es decir, donde se ingresa esa cadena, pones algún tipo de validaciones con expresiones regulares, donde solo se puede ingresar letras y/o números.
Ok  :), pero eso no es lo que busco, es con una cadena que ya contiene simbolos... :-\
Bueno, creo que lo explique bastante bien en la anterior respuesta... :silbar:

Salu2! ;)
#997
Cita de: CL1O en  1 Junio 2010, 11:06 AM
2 horas, tres como maximo!!

SAludos
No me lo creo...  :silbar:
#998
Cita de: shellroot@alex-laptop:~$ en  1 Junio 2010, 17:49 PM
Y la cadena de donde sale?

Cita de: *PsYkE1* en  1 Junio 2010, 17:34 PMReplaze,
Replace!
AJJAJA :laugh:
Tranquilo, me confundi... :xD
Como que de donde sale la cadena?Eso importa?  :huh:
Imagina que tengo este texto:
Citar
Hoy, dia lunes (mi dia faborito de la semana):
Tengo que gastar 10$.
Quitar los caracteres que no sean ni numeros ni letras, quedaria asi:
Citar
Hoy dia lunes mi dia faborito de la semana
Tengo que gastar 10

Salu2! ;)
#999
Hola, necesito saber cual es la forma óptima de quitar los caracteres que no sean ni numeros ni letras (,$%·"!%&/^¨*: ...) en una cadena...  :)
¿Quizas con Expresiones Regulares?  :huh:
Actualmente meto todos los imbolos a mano en un array y utilizo Replace, no creo que sea la mejor forma... :-\

Gracias! ;D
#1000
Cita de: M3LiNdR1 en  1 Junio 2010, 12:52 PM
No me ha gustado el ultimo cd de Pendulum, el Immersion...
:o :o :o :o
A mi me encanto... :-(
[youtube=425,350]http://www.youtube.com/watch?v=P0pOkJVb2BQ[/youtube]
Salu2!