Алгоритмы двойного метафона для полных имен - PullRequest
0 голосов
/ 03 мая 2018

У меня есть список имен полных имен и я пытаюсь сравнить / найти совпадения фонетически похожих полных имен; Я использую Double metaphone в моем C #

скажи, что мой список такой;

Abdul Hameed Khan
Shadab Akbar
Nawab Zameer Ahmed Baloch
Richard Hyden
Abdullah Habib
Abu Saleh Muhammad
Ravi Kumar
Ameet Kumar Rathore
Amit Shah 

когда я пытаюсь найти в Double Metaphone, он будет искать только начальное слово (имя).

Как бы сделать этот поиск, если я напишу Хамид , это должно вернуть Абдул Хамид-хана. в настоящее время он возвращается только с именем. Еще одна вещь, как я сравниваю арабские или урду имена в этом алгоритме.

здесь работает внешний код;

Hashtable wordsMap = new Hashtable();

FileStream wordsFile = File.OpenRead("..\\..\\..\\names.txt");
StreamReader reader = new StreamReader(wordsFile);

String word = reader.ReadLine();
while (word != null)
{
    DoubleMetaphone mp = new DoubleMetaphone(word);

    //Associate word with primary key
    ArrayList words = (ArrayList)wordsMap[mp.PrimaryKey];

    if (words == null)
    {
        words = new ArrayList();
        wordsMap[mp.PrimaryKey] = words;
    }

    words.Add(word);

    //Associate with with alternate key also
    if (mp.AlternateKey != null)
    {
        words = (ArrayList)wordsMap[mp.AlternateKey];

        if (words == null)
        {
            words = new ArrayList();
            wordsMap[mp.AlternateKey] = words;
        }

        words.Add(word);
    }

    //Read the next word
    word = reader.ReadLine();
}

//Begin prompting for search words
while (true)
{
    System.Console.Write("\nEnter search term (q to quit): ");
    String searchWord = System.Console.ReadLine().Trim();
    if (searchWord.Length == 0 || searchWord == "q")
    {
        break;
    }

    DoubleMetaphone searchMphone = new DoubleMetaphone(searchWord);

    //Search for matches to the primary key
    ArrayList matches = (ArrayList)wordsMap[searchMphone.PrimaryKey];
    if (matches != null)
    {
        foreach (String matchingWord in matches)
        {
            System.Console.WriteLine("\tFound: {0}", matchingWord);
        }
    }


    //Search for matches to the alt, if present
    if (searchMphone.AlternateKey != null)
    {
        matches = (ArrayList)wordsMap[searchMphone.AlternateKey];
        if (matches != null)
        {
            foreach (String matchingWord in matches)
            {
                System.Console.WriteLine("\tFound: {0}", matchingWord);
            }
        }
    }
}

этот исходный код в качестве ссылки используется: https://www.codeproject.com/Articles/4624/Implement-Phonetic-Sounds-like-Name-Searches-wit

...