Транслитерация и нечеткий поиск, такие как предложения Google
Мне нужно сделать нечеткий поиск с транслитерацией символов, например:
У меня есть приложение ASP.NET, база данных, в которой есть таблица со списком испанских слов (200000 записей), у меня также есть страница с полем ввода. Дело в том, что я не знаю испанского, и я не знаю, как пишется слово для поиска на испанском языке, но я знаю, как оно звучит. Поэтому в текстовое поле я ввожу поисковое слово, например, "Beautiful", но в записи err - "prekieso", и мне нужно из базы данных получить правильную версию: "precioso".
Как это можно реализовать? Другими словами, мне нужно что-то похожее на предложения Google...
2 ответа
Я думаю, что вам здесь нужна функция проверки орфографии, например: http://www.codeproject.com/KB/string/netspell.aspx
Функция, похожая на Google, намного более продвинута, и ее будет нелегко реализовать: как Google "Вы имели в виду?" Алгоритм работы?
надеюсь, это поможет.
По хранимой процедуре / функции алгоритм вычисляет расстояние Левенштейна:
USE [**dbname**]
GO
/****** Object: UserDefinedFunction [dbo].[levenshtein] Script Date: 05/27/2013 17:54:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[levenshtein](@left varchar(100), @right varchar(100))
returns int
as
BEGIN
DECLARE @difference int, @lenRight int, @lenLeft int, @leftIndex int, @rightIndex int, @left_char char(1), @right_char char(1), @compareLength int
SET @lenLeft = LEN(@left)
SET @lenRight = LEN(@right)
SET @difference = 0
If @lenLeft = 0
BEGIN
SET @difference = @lenRight GOTO done
END
If @lenRight = 0
BEGIN
SET @difference = @lenLeft
GOTO done
END
GOTO comparison
comparison:
IF (@lenLeft >= @lenRight)
SET @compareLength = @lenLeft
Else
SET @compareLength = @lenRight
SET @rightIndex = 1
SET @leftIndex = 1
WHILE @leftIndex <= @compareLength
BEGIN
SET @left_char = substring(@left, @leftIndex, 1)
SET @right_char = substring(@right, @rightIndex, 1)
IF @left_char <> @right_char
BEGIN -- Would an insertion make them re-align?
IF(@left_char = substring(@right, @rightIndex+1, 1))
SET @rightIndex = @rightIndex + 1
-- Would an deletion make them re-align?
ELSE
IF(substring(@left, @leftIndex+1, 1) = @right_char)
SET @leftIndex = @leftIndex + 1
SET @difference = @difference + 1
END
SET @leftIndex = @leftIndex + 1
SET @rightIndex = @rightIndex + 1
END
GOTO done
done:
RETURN @difference
END
ссылающееся:
select
dbo.edit_distance('Fuzzy String Match','fuzzy string match'),
dbo.edit_distance('fuzzy','fuzy'),
dbo.edit_distance('Fuzzy String Match','fuzy string match'),
dbo.edit_distance('levenshtein distance sql','levenshtein sql server'),
dbo.edit_distance('distance','server')
или же:
SELECT [Name]
FR OM [tempdb].[dbo].[Names]
WHERE dbo.edit_distance([Name],'bozhestvennia') <= 3