Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Здравствуйте, коллеги!
Если кто сталкивался с подобными вещами, подскажите, пожалуйста.

Ситуация следующая:

Дано поле NVARCHAR(MAX), в котором десятки тысяч фрагментов текста на разных языках.
Нужно придумать алгоритм, по которому можно вывести язык для каждой строки с текстом этого поля.

Можно составить краткие словари основных 10-15 языков и прогнать like'ом, можно привинтить полнотекстовый поиск, но там тоже придется строить тезаурусы. Можно использовать некоторые слова в разбивке языков из системного каталога стоплиста слов полнотекстового поиска.

Возможно, есть решение более простое и даже готовое?
Поделитесь, пожалуйста!
10 окт 12, 22:30    [13299310]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Можно хотя бы частично добиться цели, распарсив текст каждой строки на отдельные слова, затем сделать группировку по словам и определить по крайней мере пропорцию тех или иных слов от общего количества, а потом выборочно сопоставить самые частотные лингвистические единицы со словарями основных языков.

Так вот, коллеги, как лучше распарсить текст на слова в t-SQL c минимальными затратами серверных ресурсов (учитывая, что длинных текстовых строк очень много) и где можно скачать базы данных словарных единиц различных языков для SQL Server 2008?
10 окт 12, 23:44    [13299610]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
моя думать CLR для парсинга самое оно
11 окт 12, 01:06    [13299849]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
vontraumen
словарных единиц различных языков

English
думаю ,что и для других найдеться - тока експортнуть надо в БД
11 окт 12, 01:09    [13299852]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Maxx, благодарю за отклик. Словарик скачал и задействовал, только слов маловато, но, думаю, для начала хватит, а потом постараюсь найти побольше и по другим языкам.

Что касается парсинга, вместо CLR нашел здесь же на форуме решение - table-valued function:

CREATE FUNCTION dbo.ParseString(@Word NVARCHAR(MAX), @Delimiters NVARCHAR(MAX))
RETURNS TABLE AS RETURN
SELECT Position, Word
FROM
(
 SELECT V.Number, SUBSTRING(@Word, v.Number,
  (
   SELECT MIN(VV.Number)
   FROM [master].dbo.spt_values AS vv
   WHERE vv.[Type]='P' AND vv.Number BETWEEN v.Number AND LEN(@Word)+1
   AND CHARINDEX(SUBSTRING(@Word+LEFT(@Delimiters,1), vv.Number, 1),@Delimiters) > 0
  )-v.Number
 )
 FROM [master].dbo.spt_values AS v
 WHERE v.[Type]='P' AND v.Number BETWEEN 1 AND LEN(@Word) + 1
 AND CHARINDEX(SUBSTRING(LEFT(@Delimiters,1) + @Word, v.Number,1), @Delimiters) > 0
)T(Position, Word)
WHERE Word > ''



А потом берем CROSS APPLY и поехали.
Долго, конечно, но работает.


-- Разбиваем строки на слова ===========================================================
SELECT t.MsgID, t.Position, LOWER(t.Word) AS Word
INTO #ParsedWords
FROM #Msg t
CROSS APPLY dbo.ParseString(t.MsgText,'| ,.[]()?;:"!'+CHAR(9)+CHAR(10)+CHAR(13)) 
ORDER BY MsgID, Position



Потом джойним с табличкой англицких слов и выводим только NULL - в результате имеем неканоничные формы слов и слова других языков.

Буду рыть дальше. Если есть какие-либо мысли, буду признателен.
11 окт 12, 11:27    [13301144]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Это задача не системы хранения данных, это задача Application сервера.

Каков бизнес процесс? На каком этапе(?) нужно выяснить и для какой цели(?). Вот с этого надо начинать топик.
11 окт 12, 12:21    [13301530]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Mnior, нужно проанализировать накопившуюся информацию в базах.
Практически, разовая операция, но наработанный алгоритм можно будет использовать неоднократно в случае необходимости, но необходимости часто проводить подобный анализ нет.
С целью выяснения процентного соотношения языков, использованных пользователями.
11 окт 12, 12:29    [13301589]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Я использую CLR-функцию, которая обращается к Microsoft Translator.
Там есть метод Detect.

Но придётся повозиться, чтобы резвернуть в SQL Server все необходимые сборки и подписаться на Microsoft Translator.
Там 2 млн. знаков в месяц можно переводить бесплатно.
11 окт 12, 12:40    [13301705]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Можно использовать и другие online переводчики, например Google.

http://stackoverflow.com/questions/2246017/c-sharp-google-translate
http://martinnormark.com/translate-text-in-c-using-google-translate
11 окт 12, 12:47    [13301756]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Большое спасибо всем, частично решил вопрос.
А для более серьезного решения необходимо гораздо больше времени, которого, к сожалению, нет.
К тому же, в некотором смысле игра не стоит свеч, учитывая суммарный приоритет задачи.
11 окт 12, 15:05    [13302994]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Ну и не надо разворачивать это на сервере.
Приложеньице (консольное, C#) или скриптик (PowerShell) али ещё что. Лишь бы быстро и на том, что знаешь.
Просто есть туева хуча открытых и бесплатных библиотек (one click, download and go и т.п.).

Только не могу понять зачем распарсивать? Просто проверить существование символов из того или иного диапазона уникода.
По идее уже есть функция определения диапазона или регулярку взять, а далее IQuarable выраженьице для подсчёта символов диапазона. 3 строки кода. + ещё 3 для считывания данных из базы.
Ну а потом можно и городить огород для CLR от нефиг делать.
11 окт 12, 15:36    [13303300]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Просто проверить существование символов из того или иного диапазона уникода.
Хотя согласен, не надёжно. Хоть и покроет многое.
К примеру в английском может и "ö" встретиться (в газетных изданиях).
11 окт 12, 15:42    [13303346]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
12guest12
Guest
и как определить на каком это языке?

автор
Security, Datenschutz & eCommerce-Recht Newsletter
11 окт 12, 18:19    [13304374]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
12guest12, и в чём подвох?
German.

Естественно, что может быть несколько языков. А далее уже как ТС решит.
Итак понятно что топик - фигня.
11 окт 12, 22:43    [13305320]     Ответить | Цитировать Сообщить модератору
 Re: Какими средствами определить язык по тексту в поле типа nvarchar(max)?  [new]
vontraumen
Member

Откуда:
Сообщений: 29
Мне точность аптечная не нужна, мне нужна пропорция разных языков в массиве.
Что я в итоге и получил.
Посчитал частотность лексических единиц, сопоставил со словарями и вывел процент. Все.

Так что, "шутц, секьюрити унд дэм шит" - очень простая ситуация. Тут, образно говоря, 40% дойтч и 60% инглиш и в том же духе.

Вот. И еще: просил дельного совета, а оказалось, что фигня.
Ну да ладно, холивары разводить не собираюсь, ибо мне мое время важнее.

Спасибо коллегам за помощь.
Со своей стороны считаю тему закрытой.
12 окт 12, 11:37    [13307164]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить