Алгоритм поиска совпадения пользователя по нечеткому @username - PullRequest
2 голосов
/ 19 сентября 2011

Я уверен, что видел сообщение в Meta или SO, где Джефф опубликовал обновленный алгоритм, который лучше соответствует комментариям, например, когда кто-то вводит комментарий:

@Tom did you see

Это будет соответствовать имени пользователя 'Tom',Если есть специальные символы, скажите, что мое имя пользователя - «T0m», и кто-то печатает @Tom, оно все равно совпадает.

У кого-нибудь есть ссылка на этот пост, если он действительно существует?Если я правильно помню, это был код, которым он поделился, и это было бы полезно для меня!

В противном случае, учитывая список имен пользователей, которые участвуют в обсуждении:

users[0] = "Tom"
users[1] = "Peanut"
users[2] = "Ashley"
users[3] = "Jon"
users[4] = "AARÓN"

И вам дают@Aaron или @Aron в качестве входных данных, каков наилучший способ выбрать правильного пользователя, на которого ссылаются в списке?

Общий алгоритм будет в порядке, но сайт, для которого я делаю это:ASP.net c #, так что если есть пример на этом языке, это было бы замечательно.Это то, что у меня до сих пор, он отлично работает для точных совпадений (все строчные):

// Find comment references
if (Search.Type != Alerts.SectionType.error)
{
    // A list of all lower case usernames refered to in this thread
    string[] References = Alerts.CommonFunctions.extractReferences(Comment);

    // Only proceed if any references are found
    if (References.Count() > 0)
    {
        // Extract all usernames involved in this comment discussion
        UserBasic[] UsernamesInThread = getAllUsernamesInThread(Anchor);

        // Loop each reference
        foreach (string r in References)
        {
            // Try to find a match
            foreach (UserBasic u in UsernamesInThread)
            {
                // Exact match found
                if (r == u.Username)
                {
                    // Check it's not original author (we can then ignore as alert already issued)
                    if (u.UserID != Search.OriginalAuthorID)
                    {
                        Alerts.CommonFunctions.createAlert(u.UserID, Settings.CommentReplyAlertID, Search.URL, Search.Title);
                    }
                    break;
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 19 сентября 2011

Питер Норвиг написал прекрасный пример очень маленького корректора орфографии здесь:

В нем есть две реализации C #.

Для вашей конкретной задачи (где набор кандидатов очень мал), вы можете найти минимальное расстояние редактирования между целевым словом и всеми кандидатами.

...