User LoL Posted July 28, 2013 at 09:01 PM Report #520218 Posted July 28, 2013 at 09:01 PM É 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?
nelsonr Posted July 28, 2013 at 09:37 PM Report #520222 Posted July 28, 2013 at 09:37 PM 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" ?
bioshock Posted July 28, 2013 at 09:44 PM Report #520223 Posted July 28, 2013 at 09:44 PM 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.
User LoL Posted July 28, 2013 at 10:17 PM Author Report #520224 Posted July 28, 2013 at 10:17 PM (edited) é, 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 July 28, 2013 at 10:21 PM by User LoL
bioshock Posted July 28, 2013 at 10:30 PM Report #520226 Posted July 28, 2013 at 10:30 PM (edited) 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 July 28, 2013 at 10:44 PM by bioshock
thoga31 Posted July 28, 2013 at 10:30 PM Report #520227 Posted July 28, 2013 at 10:30 PM 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!
nelsonr Posted July 28, 2013 at 10:39 PM Report #520232 Posted July 28, 2013 at 10:39 PM O mais provável é querer implementar algo parecido com o similar_text do php: http://php.net/manual/en/function.similar-text.php
bioshock Posted July 28, 2013 at 11:21 PM Report #520238 Posted July 28, 2013 at 11:21 PM 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. Neste momento, se estiver mais do que uma palavra denominada "texto" ele só vai identificar uma vez, pelo que deve identificar todas as palavras. É case-sensitive Tens de implementar o código idêntico mas para a reverse string.
veaoum Posted July 29, 2013 at 02:27 PM Report #520321 Posted July 29, 2013 at 02:27 PM 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
User LoL Posted July 30, 2013 at 03:55 AM Author Report #520376 Posted July 30, 2013 at 03:55 AM 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
veaoum Posted July 30, 2013 at 05:58 AM Report #520377 Posted July 30, 2013 at 05:58 AM (edited) 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 July 30, 2013 at 06:01 AM by veaoum
User LoL Posted July 30, 2013 at 07:43 AM Author Report #520383 Posted July 30, 2013 at 07:43 AM 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
veaoum Posted July 31, 2013 at 02:52 AM Report #520443 Posted July 31, 2013 at 02:52 AM 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?
User LoL Posted July 31, 2013 at 10:50 PM Author Report #520559 Posted July 31, 2013 at 10:50 PM 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??
User LoL Posted August 2, 2013 at 02:34 AM Author Report #520659 Posted August 2, 2013 at 02:34 AM Alguém sabe como posso fazer isso?
thoga31 Posted August 2, 2013 at 01:54 PM Report #520685 Posted August 2, 2013 at 01:54 PM 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!
User LoL Posted August 18, 2013 at 06:57 PM Author Report #522028 Posted August 18, 2013 at 06:57 PM pode me dar um exemplo pratico? ainda nao consegui :/
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now