Jump to content
User LoL

Como fazer comparação de texto?

Recommended Posts

User LoL

É o seguinte, estou com dois Richtextbox e gostaria de comparar a porcentagem de semelhança entre os dois textos:

Exemplo, se no rich1 tiver "textox" e no rich2 tiver "tex" o código me informaria que a semelhança entre os dois textos é de 50%. Mas como eu faço isso?

Pensei em fazer comparação de letra em letra, primeiro ele soma todas as letras do texto, depois vai comparando da primeira ate a ultima, em cada uma, se for igual ele divide 1 pelo total de letras, e vai armazenando o valor em uma variavel, pra mostrar o resultado no final, estou no caminho certo? Alguém poderia apresentar uma forma prática de como ficaria?

Share this post


Link to post
Share on other sites
nelsonr

Mas a comparação é sempre para ser da mesma forma?

Ou seja, uma textbox vai sempre conter parte da outra? ou podes ter casos de comparar "abc" com "cde"? nesse caso dava o quê? 33% por ter 1 letra igual?

E interessa a posição das letras? Se for "abc" com "aei" dá o mesmo que "abc" com "iea" ?

Share this post


Link to post
Share on other sites
bioshock

Acho que o que ele quer é palavra principal "ABC", palavra sorteada "AB" o que perfaz 60 e picos %.

Basicamente o que fazes é percorrer a string e verificar se contens "ABC", depois passas para "AB" e não faz sentido procurar por "A". Tens de limitar um número mínimo de caracteres a efectuar a procura.

Share this post


Link to post
Share on other sites
User LoL

é, tens razão, acho que esse vai ser um projeto longo pois vai trabalhar com muitas variáveis, pois se o o rich1 tiver "texto1" e o rich2 tiver "1otxet" ele vai apontar 100% de semelhança :/ então como faço pra comparar as palavras, e tirar essa porcentagem? E, levando em conta a posição das letras sim, e posição das palavras também.

Edited by User LoL

Share this post


Link to post
Share on other sites
bioshock

Não, não vai. Pelo menos da forma que eu estou a idealizar...a menos que tu queiras que ele encontre "1otxet" ? se quiseres a conversa já muda..mas também mantenho-me pelo mesmo raciocínio.

Texto1

Texto

Text

Tex

-------

1otxet

1otxe

1otx

1ot

---------------

É isto que queres?

Edited by bioshock

Share this post


Link to post
Share on other sites
thoga31

Se a posição dos caracteres importa (por exemplo, "teste" tem 60% de semelhança com "texto" (caracteres 0, 1 e 3 coincidem)), então a análise simplifica imenso. Tens de explicar melhor quais as condições da comparação.


Knowledge is free!

Share this post


Link to post
Share on other sites
bioshock

Bem, se for como eu percebi o problema, dou o pontapé de saída para o "teu jogo".

string original = "Então texto, estás bom ou quê?";
string procurar = "texto";
int contagem = 0;

while (procurar.Length >= 3) // Ou seja, independentemente da palavra, ela tem obrigatoriamente que ter 3 caracteres
{
if (original.Contains(procurar))
{
	  contagem++;
}
procurar = procurar.Remove(procurar.Length - 1); // Vai eliminando até chegar aos 3 caracteres
}
MessageBox.Show(contagem.ToString());

Neste exemplo, ele ia dizer que a contagem era igual a 3, porque se partirmos em pedaços ficaria algo como:

Texto

Text

Tex

Mas tens no código vários desafios.

  1. Neste momento, se estiver mais do que uma palavra denominada "texto" ele só vai identificar uma vez, pelo que deve identificar todas as palavras.
  2. É case-sensitive
  3. Tens de implementar o código idêntico mas para a reverse string.

Share this post


Link to post
Share on other sites
veaoum

Boas o que eu percebi que ele quer é ir comparar se duas strings teem o mesmo caracter na mesma posição. e ai estou de acordo com ele em ir caracter a caracter,

Pensei em fazer comparação de letra em letra, primeiro ele soma todas as letras do texto

o length dá-te logo isso. Bem mas vê se isto serve?

Public Function paracencia(a As String, b As String) As Double
    ' a é o texto principal
    Dim i As Integer = 0 ' percorer o array
    Dim tamanho As Integer ' guarda o tamanha do texto menor
    Dim igual As Integer = 0 'guardar iguais
    If b.Length < a.Length Then
	    tamanho = b.Length
    Else
	    tamanho = a.Length
    End If
    While (i < tamanho)
	    If a(i) = b(i) Then _
		    igual += 1
	    i += 1
    End While
    Return Math.Round((igual * 100) / a.Length, 2, MidpointRounding.AwayFromZero)
   End Function

Share this post


Link to post
Share on other sites
User LoL

Decidi, é mais conveniente usar palavras, e montei uma lógica de testes, alguém poderia me ajudar com o código:

-Contar o numero total de palavras no rich1

-Contar o numero total de palavras no rich2

-Declarar uma string "porcentagem" com valor 100

-Declarar uma string "diminui"

-Calcular um valor equivalente a cada palavra, ou seja, se um texto tem 100 palavras, cada palavra equivale a 10% do texto

-Passar o valor equivalente da palavra para a string "diminui"

-Percorrer o rich1 e o rich2 ao mesmo tempo

-A cada palavra encontrada no rich1, ele confere no rich2 se existe aquela palavra, na mesma posição, se existe, ele segue para a próxima palavra, se não existe, ele diminui da string "porcentagem", o valor da string "diminui", ou seja, em um texto com 100 palavras, cada palavra equivale a 10% do texto e o valor da string "diminui" seria 10, subtraindo esse valor da string "porcentagem" a mesma ficaria com o valor 90.

O único problema até então: Como saber o valor equivalente de cada palavra no texto? Porque o rich1 pode ter 100 palavras, se o rich2 tiver 101 palavras já da erro

Share this post


Link to post
Share on other sites
veaoum

Afinal é palavras e não letras, se o que te interessa for as palavras e não a posição do carácter em relação ao texto. ou seja se:

rich1 = "Amanhã estamos ali atrás"

rich2="Hoje estamos aqui atrás"

o resultado certo for 50%

tenta isto:

Public Function paracencia(rich1 As String, rich2 As String) As Double
	' rich1 é o texto principal
	Dim a() As String = rich1.Replace(".", "").Split(" ") 'separa as palavras depois de eleminar os espaços
	Dim b() As String = rich2.Replace(".", "").Split(" ")
	Dim i As Integer = 0 ' percorer o array
	Dim tamanho As Integer ' guarda o tamanha do texto menor
	Dim igual As Integer = 0 'guardar iguais
	If b.Length < a.Length Then
		tamanho = b.Length
	Else
		tamanho = a.Length
	End If
	While (i < tamanho)
		If a(i) = b(i) Then _
			igual += 1
		i += 1
	End While
	Return Math.Round((igual * 100) / a.Length, 2, MidpointRounding.AwayFromZero)
End Function

Atenção não foi testado.

Edited by veaoum

Share this post


Link to post
Share on other sites
User LoL

Algo não está certo, porque veja, se eu digito "texto" no rich1 e "texto mais algum texto" no rich2, ele aponta 100% de semelhança

Share this post


Link to post
Share on other sites
veaoum

Hum.... experimenta....

   Public Function paracencia(rich1 As String, rich2 As String) As Double
    Dim a() As String = rich1.Replace(".", "").Split(" ") 'separa as palavras depois de eleminar os espaços
    Dim b() As String = rich2.Replace(".", "").Split(" ")
    Dim i As Integer = 0 ' percorer o array
    Dim tamanho As Integer ' guarda o tamanha do texto menor
    Dim maxtamanho As Integer ' guarda o tamanho do texto maior.
    Dim igual As Integer = 0 'guardar iguais
    If b.Length < a.Length Then
	    tamanho = b.Length
	    maxtamanho = a.Length
    Else
	    tamanho = a.Length
	    maxtamanho = b.Length
    End If
    While (i < tamanho)
	    If a(i) = b(i) Then _
		    igual += 1
	    i += 1
    End While
    Return Math.Round((igual * 100) / maxtamanho, 2, MidpointRounding.AwayFromZero)
   End Function

Resultou?

Share this post


Link to post
Share on other sites
User LoL

Sim, adaptei o código e funcionou. Agora, só tenho mais uma dúvida, como eu faço pra contar os 10 termos que mais se repetem em um texto??

Consegui esse, que apenas mostra quantas vezes uma palavra aparece no texto:

Public Function Contar() As Integer
    Dim strfrase As String
    Dim intTotalPalavra As Integer
    Dim objRegex As Regex = New Regex("teste")
    strfrase = "Essa e uma frase de teste"
    Dim objMach As MatchCollection = objRegex.Matches(strfrase)
    If (objMach.Count > 0) Then
	    intTotalPalavra = objMach.Count
    Else
	    intTotalPalavra = 0
    End If
    Return intTotalPalavra
   End Function

Mas oque eu quero, é saber quais as 10 palavras que mais aparecem no texto, eu teria que fazer uma varredura no texto, guardar a palavra e quantas vezes ela aparece e depois comparar uma a uma??

Share this post


Link to post
Share on other sites
thoga31

Tens de separar a String em palavras usando por exemplo uma Array de Strings - podes usar o método Split para isso.

Depois tens de eliminar as Strings repetidas na Array - não sei se há algum método para isso, mas não é difícil implementar.

E depois aplicas o método Matches a cada elemento da Array, guardando o resultado noutra Array. Por exemplo, nessa Array os dados podem ficar guardados com este formato: "exemplo=2" <-- a palavra "exemplo" repete-se 2 vezes na frase.

Atenção: terás de ter em atenção que a comparação de Strings é case-sensitive.


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.