Мой SQL Server отличный переводчик

by Admin 17. марта 2010 12:42

Совсем недавно у меня появилась безумная идея: как организовать автоматический перевод текстов внутри сервера БД.

Возможно, это глупо перекладывать такую логику и задачу на SQL Server, т.к. он предназначен совсем для других целей...но, согласитесь, как было бы здорово, если бы наш сервер сам переводил наши данные на другой язык либо динамически либо по расписанию, пусть даже это будет машинный перевод. Прежде чем приступить к реализации этого безумия, я стал искать какие переводчики доступны в сети, главные критери: бесплатный и более или менее читабельный перевод.

Мой выбор пал на переводчик Microsoft® Translator (http://www.microsofttranslator.com/)

 

 

 

 На странице этого переводчика есть возможность переводить тексты on-line:

 

Но самое главное, что Microsoft предлагает богатый набор инструментов для интеграции переводчика в наши системы (http://www.microsofttranslator.com/Tools/)

 

Microsoft Translator Interactive SDK (http://sdk.microsofttranslator.com/) содержит примеры, как можно работать с этим инструментом:

 

Меня интересует SOAP Interface, пару месяцев назад я писал, как можно работать с Web-службами через CLR (http://www.t-sql.ru/post/WebCLR.aspx), но прежде чем начать писать сборку для перевода текстов внутри БД, необходимо зарегистрировать (если вы ещё этого не сделали) AppID (http://www.bing.com/developers/createapp.aspx), который открывает вам доступ к богатому набору инструментов, в том числе и доступ к Microsoft Translator.

После регистрации и активации AppID, можем переходить к разработке нашей сборки, примеры работы с Web-службой описаны на странице Microsoft Translator Interactive SDK.

Для начала создадим прокси-сборку, для этого необходимо выполнить команду:

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\wsdl.exe" /o:Translator.cs /n:WS http://api.microsofttranslator.com/V1/Soap.svc

Для удобства, я создал отдельную папку C:\Translator, и в ней создал BAT-ник с этой командой. После запуска этого батника в папке появился файл Translator.cs.

Теперь создадим наш класс, из которого будет сделана наша сборка: TranslatorCLR.cs

using System;
using Microsoft.SqlServer.Server;
using System.Data;
using System.Data.SqlTypes;
using System.Collections;
using WS;

public class WSClass
{
  	[SqlFunction(FillRowMethodName = "FillRow",
        	TableDefinition = "Lng nvarchar(10), Language nvarchar(100)")
    	]

//Получаем список доступных языков
public static IEnumerable GetLanguages(String AppID, string locale)
{
	ArrayList Rows = new ArrayList();
        WS.Soap lsc = new WS.Soap();
	string[] s1=lsc.GetLanguages(AppID);
	string[] s2=lsc.GetLanguageNames(AppID, locale);

	for(int i = 0; i<=s1.Length-1; i++)
	{
	Rows.Add(new object[] {s1[i], s2[i]});
	}

        return Rows;
}

public static void FillRow(
                        Object row,
                        out string Lng, out string Language)
{
	object[] xrow = (object[])row;
	Lng = (string)xrow[0];
	Language = (string)xrow[1];
}

//Перевод текста
public static string Translate(String AppID, string InputStr, string forLanguage, string toLanguage)
{

        WS.Soap lsc = new WS.Soap();
	string s=lsc.Translate(AppID, InputStr, forLanguage, toLanguage);
        return s;
}

//Определение на каком языке текст
public static string Detect(String AppID, string InputStr)
{

        WS.Soap lsc = new WS.Soap();
	string s=lsc.Detect(AppID, InputStr);
        return s;
}

}

Теперь на базе 2х классов можем создать нашу сборку, для этого создаю ещё один батник с кодом

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CSC" /target:library /out:TranslatorWS.dll *.cs

На выходе получаем библиотеку TranslatorWS.dll.

Последний шаг-создаём сборку сериализации XML для типов в нашей сборке, для этого я опять делаю батник с текстом:

"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sgen.exe" /a:TranslatorWS.dll

На выходе ещё одна библиотека: TranslatorWS.XmlSerializers.dll

Теперь регистрируем наши сборки в БД, создаём функции и начинаем работать:

CREATE DATABASE TestDB
GO

ALTER DATABASE TestDB SET TRUSTWORTHY ON
GO

USE TestDB
GO

CREATE ASSEMBLY ClrWebServices
FROM 'C:\Translator\TranslatorWS.dll'
WITH PERMISSION_SET = UNSAFE;
GO

CREATE ASSEMBLY [ClrWebServices.XmlSerializers]
FROM 'C:\Translator\TranslatorWS.XmlSerializers.dll'
WITH PERMISSION_SET = SAFE;
GO

CREATE FUNCTION [dbo].[GetLanguages]
(
@AppID nvarchar(40),
@locale nvarchar(10)
)
RETURNS TABLE
(
Lng nvarchar(10),
Language nvarchar(100)
)
AS
EXTERNAL NAME [ClrWebServices].[WSClass].[GetLanguages]
GO

CREATE FUNCTION [dbo].[Translate]
(
@AppID nvarchar(40),
@InputStr nvarchar(max),
@forLanguage nvarchar(5),
@toLanguage nvarchar(5)
)
RETURNS nvarchar(MAX)
AS
EXTERNAL NAME [ClrWebServices].[WSClass].[Translate]
GO

CREATE FUNCTION [dbo].[Detect]
(
@AppID nvarchar(40),
@InputStr nvarchar(max)
)
RETURNS nvarchar(MAX)
AS
EXTERNAL NAME [ClrWebServices].[WSClass].[Detect]
GO

Для начала получим список доступных языков:

SELECT * from [dbo].[GetLanguages] ('****************************', 'ru')

Где вместо звёздочек вы указываете ваш AppID, а 2ой параметр-это язык на которов вы хотите получить описание доступных языков, на выходе вот такая табличка:

  1. ar арабский
  2. bg болгарский
  3. zh-CHS китайский упрощенный
  4. zh-CHT китайский традиционный
  5. cs чешский
  6. da датский
  7. nl нидерландский
  8. en английский
  9. ht Гаитянский
  10. fi финский
  11. fr французский
  12. de немецкий
  13. el греческий
  14. he иврит
  15. hu венгерский
  16. it итальянский
  17. ja японский
  18. ko корейский
  19. lt литовский
  20. no норвежский
  21. pl польский
  22. pt португальский
  23. ro румынский
  24. ru русский
  25. sk словацкий
  26. sl словенский
  27. es испанский
  28. sv шведский
  29. th тайский
  30. tr турецкий

На момент написания этого поста, было доступно 30 языков.

Следующим примером я покажу, как определить на каком языке текст, для этого создам таблицу с 2мя записями на русском и английском и запустим нашу функцию:

DECLARE @s TABLE (val varchar(max))
INSERT INTO @s
SELECT 'Enter some text for the language you want detected'
UNION ALL
SELECT 'Шла Cаша по шоссе'

SELECT *, [dbo].[Detect]('****************************', val) FROM @s

Результат:

 

Ну и собственно, сам перевод данных:

DECLARE @s nvarchar(max)
SET @s='With upcoming release of the latest version of Microsoft SQL Server, SQL Server 2008 R2, Microsoft continues to build on the Information Platform Vision by enabling businesses to deliver near real-time information through rich applications. Not only does SQL Server offers a complete approach to managing, accessing and delivering information across the organization; but now the power of SQL Server is extending to the Cloud through SQL Azure. SQL Azure provides a consistent program model and common tools while offering new business opportunities, high availability, and massive scale through distributed data services.
People are at the center of the Information Platform – IT and Database professionals who support the expanding needs of the business, Developers who build solutions quickly to capture business opportunities and End users who are looking to quickly mine volumes of data for business insights. SQL Server 2008 R2 delivers something unique and empowering to each of these contributors.
'

SELECT [dbo].[Translate] ('****************************', @s, 'en', 'ru')

Результат перевода можете оценить сами:

С предстоящем выпуске последней версии Microsoft SQL Server, SQL Server 2008 R2, Майкрософт продолжает опираться на информационной платформы видение, позволяя предприятиям для доставки вблизи реального времени информацию с помощью многофункциональных приложений. Не только делает SQL Server предлагает полный подход к управлению, доступ к и доставки информации по организации; но теперь власть SQL Server расширение в облаке через SQL лазурь. Лазурный SQL предоставляет модель последовательной программы и общие инструменты предлагая новые бизнес-возможности, высокая доступность и массовом масштабе путем распределенных данных услуг. Люди, в центре платформы информации – база данных и ИТ специалистов, которые поддерживают расширение потребностей бизнеса, разработчики, которые создают решения быстро захватить бизнес-возможности и конечных пользователей, которые хотят быстро шахты объемы данных для бизнес-идеи. SQL Server 2008 R2 обеспечивает что-то уникальное и расширение прав и возможностей для каждого из этих вкладчиков..

Tags: , , , ,

SQL Server

Комментарии (1) -

alert
alert Russia
16.06.2011 17:15:23 #

Спасибо!!! Кому интересно в windows 7 пришлось заменить пути "C:\Program Files\Microsoft SDKs\Windows\v6.0A\*" на
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\*"
и в файле TranslatorCLR.cs "WS.Soap" на "WS.SoapService"

Reply

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading