16

私のマネージャーは、綴りが異なっていても発音の仕方が似ている名前を評価する方法があると言っています。理想的には、ユーザーが入力した検索名を評価し、完全に一致する名前と「類似した名前」を返すことができるようにする必要があります。彼はこのプロセスを「Soundits」と呼んでいましたが、Googleで情報を見つけることができません。

これは存在しますか?VBA(Access)で利用できるかどうか誰か知っていますか?

4

5 に答える 5

20

いい質問です!あなたの質問には、アイデア自体の素晴らしい例が含まれています。

Russell Soundexアルゴリズムと呼ばれるアルゴリズムがあります。これは、多くのアプリケーションの標準的な手法であり、実際のスペルではなく音声で名前を評価します。この質問では、SounditsSoundexは似たような名前です![編集:Soundexを実行しただけです。Soundits=S532およびSoundex=S532。]

Soundexについて:

Soundexアルゴリズムは、次のような英語の特性に基づいています。

  1. 最初の文字は重要性が高い
  2. 多くの子音は似ているように聞こえます
  3. 子音は母音よりも発音に影響を与えます

1つの警告:Soundexは名前のために設計されました。短いほど良いです。名前が長くなると、Soundexの信頼性が低下します。

資力:

  1. これは、 AccessにVBAを使用する例です。
  2. ケン・ゲッツとマイク・ギルバートによるVBA開発者ハンドブック第2版に、Soundexに関する記事があります。
  3. SoundexおよびSoundex2(「Soundex」および「VBA」を検索)などの他のバリアントに関する多くの情報があります。

コード例:

以下は、Soundexアルゴリズムのバリエーションを実装する、クイックWeb検索で見つかったVBAコードです。

Option Compare Database
Option Explicit

Public Function Soundex(varText As Variant) As Variant
On Error GoTo Err_Handler
    Dim strSource As String
    Dim strOut As String
    Dim strValue As String
    Dim strPriorValue As String
    Dim lngPos As Long

    If Not IsError(varText) Then
        strSource = Trim$(Nz(varText, vbNullString))
        If strSource <> vbNullString Then
            strOut = Left$(strSource, 1&)
            strPriorValue = SoundexValue(strOut)
            lngPos = 2&

            Do
                strValue = SoundexValue(Mid$(strSource, lngPos, 1&))
                If ((strValue <> strPriorValue) And (strValue <> vbNullString)) Or (strValue = "0") Then
                    strOut = strOut & strValue
                    strPriorValue = strValue
                End If
                lngPos = lngPos + 1&
            Loop Until Len(strOut) >= 4&
        End If
    End If

    If strOut <> vbNullString Then
        Soundex = strOut
    Else
        Soundex = Null
    End If

Exit_Handler:
    Exit Function

Err_Handler:
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "Soundex()"
    Resume Exit_Handler
End Function
Private Function SoundexValue(strChar As String) As String
    Select Case strChar
    Case "B", "F", "P", "V"
        SoundexValue = "1"
    Case "C", "G", "J", "K", "Q", "S", "X", "Z"
        SoundexValue = "2"
    Case "D", "T"
        SoundexValue = "3"
    Case "L"
        SoundexValue = "4"
    Case "M", "N"
        SoundexValue = "5"
    Case "R"
        SoundexValue = "6"
    Case vbNullString
        SoundexValue = "0"
    Case Else
        'Return nothing for "A", "E", "H", "I", "O", "U", "W", "Y", non-alpha.
    End Select
End Function

レーベンシュタイン距離

文字列を比較する別の方法は、レーベンシュタイン距離を取得することです。これはVBAで与えられた例です、それはLessThanDotWikiから取られています:

Function LevenshteinDistance(word1, word2)

Dim s As Variant
Dim t As Variant
Dim d As Variant
Dim m, n
Dim i, j, k
Dim a(2), r
Dim cost

   m = Len(word1)
   n = Len(word2)

   ''This is the only way to use
   ''variables to dimension an array
   ReDim s(m)
   ReDim t(n)
   ReDim d(m, n)

   For i = 1 To m
       s(i) = Mid(word1, i, 1)
   Next

   For i = 1 To n
       t(i) = Mid(word2, i, 1)
   Next

   For i = 0 To m
       d(i, 0) = i
   Next

   For j = 0 To n
       d(0, j) = j
   Next


   For i = 1 To m
       For j = 1 To n

           If s(i) = t(j) Then
               cost = 0
           Else
               cost = 1
           End If

           a(0) = d(i - 1, j) + 1             '' deletion
           a(1) = d(i, j - 1) + 1             '' insertion
           a(2) = d(i - 1, j - 1) + cost      '' substitution

           r = a(0)

           For k = 1 To UBound(a)
               If a(k) < r Then r = a(k)
           Next

           d(i, j) = r

       Next

   Next

   LevenshteinDistance = d(m, n)

End Function
于 2009-10-22T14:39:09.180 に答える
4

VBAでのSOUNDEXアルゴリズムのいくつかの実用的な例を次に示します。

于 2009-10-22T14:42:42.307 に答える
3

Soundex に加えて、Soundex2 (より粒度の細かい Soundex の変形) と、別の種類のマッチングである Simil() も検討する必要があります。私は3つすべてを使用します。

于 2009-10-23T01:23:08.917 に答える
0

あなたはSOUNDEXを探しています。

于 2009-10-22T14:39:01.000 に答える
0

また、名と姓の最初の 2 文字または 3 文字を使用することも検討してください。私が持っていた 10,000 の名前のデータベースでは、Jo Sm (Joe/John/Joan Smith) は 3 つまたは 4 つのレコードしか返しませんでした。

また、ファーストネームの種類。短縮バージョンを使用する人々を獲得する予定はありますか? たとえば、私の本名は Anthony ですが、常に Tony と呼ばれています。

于 2009-10-22T23:05:23.173 に答える