0

文字の音訳を使用してあいまい検索を行う必要があります。次に例を示します。

スペイン語の単語 (200,000 エントリ) のリストを含むテーブルを含む ASP.NET アプリケーション、データベースがあり、入力フィールドを含むページもあります。要点は、私はスペイン語を知らないということです。スペイン語で検索語を綴る方法はわかりませんが、どのように聞こえるかは知っています。したがって、テキストボックスに「beautiful」などの検索語を入力しますが、録音エラー「prekieso」に入力すると、データベースから正しいバージョン「precioso」を取得する必要があります。

これはどのように実装できますか?言い換えれば、私はGoogleの提案に似たものが必要です...

4

2 に答える 2

0

ここで必要なのは、次のようなスペル チェック機能だと思います: http://www.codeproject.com/KB/string/netspell.aspx

Google のような機能ですが、はるかに高度ですが、実装するのは簡単ではありませ ん。アルゴリズムの仕事?

この助けを願っています。

于 2013-05-27T14:27:56.177 に答える
0

ストアド プロシージャ/関数、アルゴリズムは距離レーベンシュタインを計算します。

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
于 2013-05-27T22:04:27.917 に答える