Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 20 de Julho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
36 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Artigos]  Utilizando o Corretor Ortográfico do Google
Publicado por rboaro : Segunda, Janeiro 14, 2013 - 08:35 GMT-3 (832 leituras)
Comentários 3 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Olá amigons!
Recentemente tive a necessidade de implementar um corretor ortográfico em uma solução Delphi.
Pedi algumas indicações e me sugeriram:
http://devexpress.com/Products/VCL/ExSpellChecker/
Não cheguei a testá-los mas foram muito bem recomendados. Mas durante minhas pesquisas acabei me deparando com uma solução do Google.Eu não tenho certeza, e se algum leitor for mais bem informado e puder fazer a gentileza de colocar as suas considerações nos comentários, mas o Google tem um recurso chamado Google Tool Bar Proxy e um dos recursos oferecidos é justamente o de correção ortográfica.

A URL do serviço é:

http://www.google.com/tbproxy/spell?lang=pt&hl=pt

Basicamente deve-se fazer um POST (HTTP) com um conteúdo XML e analisar o retorno. Vamos imaginar então a palavra "coracao". O XML de requisição seria:

<!--?xml version="1.0" encoding="UTF-8"?-->
<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="0">
<text>coracao</text>
</spellrequest>

E uma resposta válida seria algo como:

<!--?xml version="1.0" encoding="UTF-8"?-->
<spellresult error="0" clipped="0" charschecked="7" suggestedlang="en">
<c o="0" l="7" s="0">coração</c>
</spellresult>

Indo ao ponto, desenvolvi o código abaixo devidamente comentado. É um projeto do tipo console. É um ótimo exemplo pois tem uma pitada de XML e Expressão Regular. Confesso que levei algumas boas horas para desenvolver este exemplo.

Me atrapalhei com o TXMLDocument e o UTF-8. Graças a este post de Caio Oliveira consegui resolver e me dei conta de um aparente bug. Achei estranho, mas de fato foi a solução. Neste projeto foi desenvolvido a classe TCorretor onde efetivamente esta a solução.

program CorretorOrtografico;

{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils,
Xml.XMLDoc,
Xml.XMLIntf,
IdHTTP,
System.Classes,
WinApi.ActiveX,
System.RegularExpressions,
IdGlobal;

type

/// <summary>
/// Implementa o recurso de correção ortográfica oferecido pelo Google
/// </summary>
/// <remarks>
/// Descende de TComponent para servir de base para o XMLDocument
/// </remarks>
/// <author>
/// José Mário Silva Guedes - jmarioguedes@gmail.com - eugostododelphi.blogspot.com
/// </author>
TCorretor = class(TComponent)
private
/// <summary>
/// Estrutura do documento XML
/// </summary>
FXML: TXMLDocument;
/// <summary>
/// Comunicação HTTP
/// </summary>
FHTTP: TidHTTP;
public
procedure AfterConstruction; override;
/// <summary>
/// Processa efetivamente o corretor ortográfico
/// </summary>
/// <param name="AEntrada"> /// Texto de entrada
/// /// <param name="ASaida"> /// Possibilidades de correção
/// /// <param name="AMotivo"> /// Motivo de um eventual insucesso
/// /// <returns>
/// Indica o sucesso da operação
/// </returns>
function Processar(AEntrada: string; ASaida: TStrings; AMotivo: string): Boolean;
end;

var
bRet : Boolean;
oCorretor: TCorretor;
sEntrada : string;
slSaida : TStringList;
sMotivo : string;
sPalavra : string;
cSaida : Char;
{ TCorretor }

procedure TCorretor.AfterConstruction;
begin
inherited;
Self.FHTTP := TidHTTP.Create(Self);
Self.FXML := TXMLDocument.Create(TDataModule.Create(Self));
end;

function TCorretor.Processar(AEntrada: string; ASaida: TStrings; AMotivo: string): Boolean;
const
C_URL = 'http://www.google.com/tbproxy/spell?lang=pt&;hl=pt';
var
oRequest : TStringStream;
oResponse : TStringStream;
sResponse : string;
sRequest : string;
sResultado: string;
_raiz : IXMLNode;
_texto : IXMLNode;
_resultado: IXMLNode;
aPartes : TArray<string>;
begin
oRequest := nil;
oResponse := nil;
try
{$REGION 'Preparando o pedido'}
Self.FXML.Active := False;
Self.FXML.Active := True;
Self.FXML.Version := '1.0';
Self.FXML.Encoding := 'UTF-16';

_raiz := Self.FXML.AddChild('spellrequest');
_raiz.Attributes['textalreadyclipped'] := '0';
_raiz.Attributes['ignoredups'] := '0';
_raiz.Attributes['ignoredigits'] := '1';
_raiz.Attributes['ignoreallcaps'] := '0';

_texto := Self.FXML.CreateNode('text');
_texto.Text := AEntrada;
_raiz.ChildNodes.Add(_texto);
{$ENDREGION}
{$REGION 'Gambiarra do UTF-8'}
Self.FXML.SaveToXML(sRequest);
// http://www.caiooliveira.com.br/?p=422
// http://qc.embarcadero.com/wc/qcmain.aspx?d=37433
sRequest := TRegEx.Replace(sRequest, 'UTF-16', 'UTF-8');
oRequest := TStringStream.Create;
oRequest.WriteString(sRequest);
oRequest.Seek(0, 0);
{$ENDREGION}
{$REGION 'Request\Response'}
Self.FHTTP.Request.Accept := 'text/xml';
Self.FHTTP.Request.ContentType := 'text/xml';
Self.FHTTP.Request.ContentEncoding := 'utf-8';
oResponse := TStringStream.Create;
Self.FHTTP.Post(C_URL, oRequest, oResponse);
sResponse := UTF8ToString(RawByteString(oResponse.DataString));
Self.FXML.Active := False;
Self.FXML.LoadFromXML(sResponse);
{$ENDREGION}
{$REGION 'Analisando a resposta'}
_resultado := Self.FXML.DocumentElement.ChildNodes.FindNode('c');
while (Assigned(_resultado)) do
begin
sResultado := _resultado.Text;
aPartes := TRegEx.Split(sResultado, #9);
for sResultado in aPartes do
begin
ASaida.Add(sResultado);
end;
_resultado := _resultado.NextSibling;
end;
Result := True;
{$ENDREGION}
finally
if (Assigned(oRequest)) then
begin
oRequest.Free;
end;
if (Assigned(oResponse)) then
begin
oResponse.Free;
end;
end;
end;

begin
oCorretor := nil;
slSaida := nil;
ReportMemoryLeaksOnShutdown := True;
CoInitialize(nil);

try
Writeln('/--------------------------------------------------------------\');
Writeln('| .:: DEMONSTRAÇÃO DE USO DO CORRETOR ORTOGRÁFICO GOOGLE ::. |');
Writeln('| jmarioguedes@gmail.com - http://eugostododelphi.blogspot.com |');
Writeln('\--------------------------------------------------------------/');
Writeln('');
Writeln('');

oCorretor := TCorretor.Create(nil);
slSaida := TStringList.Create;
repeat
write('Digite um texto: ');
Readln(sEntrada);
Writeln('');

slSaida.Clear;
bRet := oCorretor.Processar(sEntrada, slSaida, sMotivo);
if (bRet) then
begin
if (slSaida.Count > 0) then
begin
for sPalavra in slSaida do
begin
Writeln('-> ' + sPalavra);
end;
Writeln('');
end
else
begin
Writeln('Não houve resultados');
end;
end
else
begin
Writeln(Format('Insucesso na correção: ', [sMotivo]));
end;

Write('Tecle X para cancelar ou qualquer outra tecla para continuar: ');
ReadLn(cSaida);

until (CharInSet(cSaida, ['X', 'x']));

finally
if (Assigned(oCorretor)) then
begin
oCorretor.Free;
end;
if (Assigned(slSaida)) then
begin
slSaida.Free;
end;

Writeln('- Fim do Sistema - ');
Readln;
end;

end.
</string>

Link Original do Artigo:
http://eugostododelphi.blogspot.com.br/


Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: tiagoshimizu (tiagoshimizu@hotmail.com) : Jan 14, 2013 - 01:28
(Informações sobre o membro | Enviar uma mensagem) http://http://
Utilizo o delphi 2010. Teria algo compativel do RegularExpressions para esta versão?


por: crisck (crisck@hotmail.com) : Ago 07, 2013 - 06:01
(Informações sobre o membro | Enviar uma mensagem) http://
Gostaria de saber como enviar email usando o delphi 2009 (gmail)
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados