Как вычислить все триграммы строки в SQL Server - PullRequest
1 голос
/ 30 сентября 2010

Я хочу вычислить и посчитать все триграммы строки в SQL Server.

Например, если строка hello, я хочу следующий вывод:

Trigram Count
------- -----
hel     1
ell     1
llo     1
lo-     1

Страница Википедии на н-грамме

Ответы [ 3 ]

4 голосов
/ 30 сентября 2010

Заимствуя у Эда и Мартина, я думаю, что это правильная реализация:

declare @string varchar(max) = 'here kitty kitty' 

SET @string = replace(@string, ' ', '-') --Wikipedia says this should be underscore, not dash
;with n as 
( 
    SELECT 1 AS i 
    UNION ALL 
    SELECT i + 1  
    FROM n 
    WHERE i < (LEN(@string)-2) 
) 
select SUBSTRING(@string, i, 3) AS Trigram, COUNT(*) AS Count 
from n 
group by SUBSTRING(@string, i, 3) 
option (maxrecursion 0) 
2 голосов
/ 30 сентября 2010

Основано на ответе Мартина Смита - добавлена ​​логика для добавления строки с - к числу символов, кратному 3

declare @string varchar(max) = 'hello'

SET @string = (SELECT CASE LEN(@string) % 3
                          WHEN 1 THEN @string + '--'
                          WHEN 2 THEN @string + '-'
                          ELSE @string
                      END )
;with n as
(
SELECT 1 AS i
UNION ALL
SELECT i+1 
FROM n
WHERE i < (LEN(@string)-2)
)
select SUBSTRING(@string, i, 3) AS Trigram, COUNT(*) AS Count
from n
group by  SUBSTRING(@string, i, 3)
option (maxrecursion 0)
1 голос
/ 30 сентября 2010

Я до сих пор не знаю, что такое n-грамм, но, исходя из ответа Эда, это то, что вам нужно?

declare @string varchar(max) = 'hello'
declare @n int = 3

set @string = @string + REPLICATE('-',@n - (len(@string) % @n))

;with n as
(
SELECT 1 AS i
UNION ALL
SELECT i+1 
FROM n
WHERE i <= (LEN(@string)-@n)
)
select SUBSTRING(@string, i, @n), COUNT(*)
from n
group by  SUBSTRING(@string, i, @n)
option (maxrecursion 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...