Нахождение подобного звучащего текста в [закрытом] VBA

Для большего разнообразия, с помощью простых объектов C#, следующее производит тот же вывод как превосходное регулярное выражение @MizardX.

public string FromCamelCase(string camel)
{   // omitted checking camel for null
    StringBuilder sb = new StringBuilder();
    int upperCaseRun = 0;
    foreach (char c in camel)
    {   // append a space only if we're not at the start
        // and we're not already in an all caps string.
        if (char.IsUpper(c))
        {
            if (upperCaseRun == 0 && sb.Length != 0)
            {
                sb.Append(' ');
            }
            upperCaseRun++;
        }
        else if( char.IsLower(c) )
        {
            if (upperCaseRun > 1) //The first new word will also be capitalized.
            {
                sb.Insert(sb.Length - 1, ' ');
            }
            upperCaseRun = 0;
        }
        else
        {
            upperCaseRun = 0;
        }
        sb.Append(c);
    }

    return sb.ToString();
}
15
задан Dori 6 November 2011 в 08:48
поделиться

5 ответов

Хороший вопрос! Ваш вопрос включает в себя отличный пример самой идеи.

Существует алгоритм под названием Russell Soundex , стандартный метод во многих приложениях, который оценивает имена по фонетическому, а не по фактическому написанию. В этом вопросе Soundits и Soundex - похожие по звучанию имена! [РЕДАКТИРОВАТЬ: только что запустил Soundex. Soundits = S532 и Soundex = S532.]

О Soundex:

Алгоритм Soundex основан на таких характеристиках английского языка, как:

  1. Первая буква имеет большое значение
  2. Многие согласные звучат одинаково
  3. Согласные влияют на произношение больше, чем гласные

Одно предупреждение: Soundex был разработан для имен. Чем короче, тем лучше. Когда имя становится длиннее, Soundex становится менее надежным.

Ресурсы:

  1. Вот пример, который использует VBA для Access .
  2. В Руководстве разработчика VBA, 2-е издание Кена Гетца и Майка Гилберта есть описание Soundex.
  3. Существует много информации о Soundex и других вариантах, таких как Soundex2 ( Найдите "Soundex" и "VBA".

Пример кода:

Ниже приведен код VBA, найденный с помощью быстрого поиска в Интернете, который реализует вариант алгоритма Soundex.

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, он взят из LessThanDot Wiki :

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
19
ответ дан 1 December 2019 в 02:46
поделиться

Также рассмотрите возможность использования первого две или три буквы имени и фамилии. В базе данных из 10 000 имен Джо Смит (Джо / Джон / Джоан Смит) вернул только три или четыре записи.

Также какой тип имен. Собираетесь ли вы привлечь людей, использующих сокращенную версию? Например, мое официальное имя - Энтони, но меня всегда зовут Тони.

0
ответ дан 1 December 2019 в 02:46
поделиться

Вот несколько рабочих примеров алгоритма SOUNDEX в VBA:

4
ответ дан 1 December 2019 в 02:46
поделиться

Вы ищете SOUNDEX.

0
ответ дан 1 December 2019 в 02:46
поделиться

В дополнение к Soundex, который часто дает вам слишком слабое соответствие, чтобы быть действительно полезным, вам также следует обратить внимание на Soundex2 (вариант Soundex, который более детализирован), и для другого типа сопоставления Simil () . Я использую все три.

3
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: