рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд╕рдореНрдореЗрд▓рди 2013 рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ .NET рдХреЗ рддрд╣рдд рд╕рднреА рдпреИрдВрдбреЗрдХреНрд╕ рднрд╛рд╖рд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЧреЛрдЧреНрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рдж,
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ
рдереЗ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рднреА рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо
рд░реЗрд╕реНрдЯрд░реНрд╢рдк , рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рднрд┐рдиреНрди
рдЧрд┐рддреВрдм рдХрд╛рд░реНрдпреЛрдВ (рдЬрд╛рд░реАрдХрд░реНрддрд╛, рд░рд┐рд▓реАрдЬ, рдорд╛рд░реНрдХрдбрд╛рдЙрди, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЖрдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╡рд┐рд╖рдп рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред
рддреБрд░рдВрдд рдореИрдВ GitHub рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ:
рдХреЛрдб ,
рдмрд╛рдЗрдирд░реАрдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛
- Yandeks.Prediktorред рдпрд╣ рд╕реЗрд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╢рдмреНрдж рдпрд╛ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рднрд╡рд┐рд╖реНрдпрд╡рдХреНрддрд╛ рдореВрд▓ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЯрд╛рдЗрдкреЛрд╕ рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдкрд╛рда рдЗрдирдкреБрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
- Yandeks.Slovariред рдпрд╣ рд╕реЗрд╡рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдпреИрдВрдбреЗрдХреНрд╕ рдорд╢реАрди рд╢рдмреНрджрдХреЛрд╢реЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддреГрдд рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд▓реЗрдЦ рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдЕрдиреБрд╡рд╛рдж, рднрд╛рд╖рдг рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА, рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд▓реЗрдЦрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- Yandeks.Perevodред 30 рд╕реЗ рдЕрдзрд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдЕрдиреБрд╡рд╛рджред
- Yandeks.Spellerред рд╡рд░реНрддрдиреА рдЬрд╛рдБрдЪ рд╕реЗрд╡рд╛ рдЬреЛ рд╡рд░реНрддрдиреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдФрд░ рд╕рд╣реА рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдХрд░рддреА рд╣реИред рд╕реЗрд╡рд╛ рд╡рд░реНрддрдиреА рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╕реНрдкреЗрд▓рд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░реВрд╕реА, рдпреВрдХреНрд░реЗрдиреА рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЧреНрд░рдВрдереЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред
RestSharp рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP GET рдФрд░ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА XML рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ XML рдпрд╛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ .NET рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ (XML рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдбреЗрдореЗрд░реБ - рд▓реЗрд╡реЗрдВрд╕рд╣рд╛рдЗрдЯ рджреВрд░реА рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди
рд╕реНрдкреЗрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рди рдХреЗрд╡рд▓ рдкрд╛рда рдХрд╛ рдПрдХ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рдмрд▓реНрдХрд┐ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рднреА рдереАрдВред
рд▓реЗрд╡рд┐рдВрд╕реНрдЯреАрди рдХреА
рджреВрд░реА рдХрд╛
рдЦреНрдпрд╛рд▓ рддреБрд░рдВрдд рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐:
- рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп 80% рд╣реИрдВ (рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛)ред
- рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рджреВрд░реА рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдирдП рд╢рдмреНрдж рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВред
рдкрд╣рд▓рд╛ рджреЛрд╖
рджрд╛рдореЗрд░реБ - рд▓реЗрд╡реЗрдиреНрд╢рд┐рди рджреВрд░реА рджреНрд╡рд╛рд░рд╛ рдСрдлрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ (рджреВрд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рджреВрд░реА рд╣реЛрдЧреАред )ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЧрд▓рдд (рд╢рдмреНрдж) рдФрд░ рд╕рд╣реА (рд╕реБрдзрд╛рд░) рд╢рдмреНрджреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
- рдЬрдЧрд╣ред рдЙрджрд╛рд╣рд░рдг: рд╕рд┐рдирдХреНрд░реЛрдкрд╣рд╛рд╕рдЯреНрд░реЙрди -> рд╕рд┐рдиреНрдХреНрд░реЛрдкреНрд░реЛ рдлреЗрдЬ рдУ рд╕рд┐рдВрд╣рд╛рд╕рди
- рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг: рд╕рд┐рдирдХреНрд░реЛрдкрд╕реЛрддреНрд░ -> рд╡рд╣ рд╕рд┐рдирдХреНрд░реЛрдкрд╕реЛрддреНрд░
- рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: рд╕рд┐рдирдХреНрд░реЙрдлрд╝рд╛рдЬрд╝реЛрдЯреНрд░реЙрди -> рд╕реА рдПрдирдПрдХреНрд╕ рд░реЙрдлрд╝ рдПрдЬрд╝ рдУрдЯреНрд░реЙрди
- рд╕реНрдерд╛рдирд╛рдВрддрд░рдгред рдЙрджрд╛рд╣рд░рдг: рд╕рд┐рдирдХреНрд░реЛрдкрд╣рд╛рд╕реЛрд░реНрдЯреЛрди -> рд╕рд┐рдирдХреНрд░реЛрдкреНрд╕реЛ рдЯреНрд░
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рдЬрди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдХрд╛ рд╡рдЬрди рдПрдХ рд╕рдорд╛рди рд╣реИ)ред
рджрдорд░реЗрдЙ - рд▓реЗрд╡реЗрдиреНрд╢рд┐рди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреЛрдбpublic static List<Mistake> DamerauLevenshteinDistance( string word, string correctedWord, bool transposition = true, int substitutionCost = 1, int insertionCost = 1, int deletionCost = 1, int transpositionCost = 1) { int w_length = word.Length; int cw_length = correctedWord.Length; var d = new KeyValuePair<int, CharMistakeType>[w_length + 1, cw_length + 1]; var result = new List<Mistake>(Math.Max(w_length, cw_length)); if (w_length == 0) { for (int i = 0; i < cw_length; i++) result.Add(new Mistake(i, CharMistakeType.Insertion)); return result; } for (int i = 0; i <= w_length; i++) d[i, 0] = new KeyValuePair<int, CharMistakeType>(i, CharMistakeType.None); for (int j = 0; j <= cw_length; j++) d[0, j] = new KeyValuePair<int, CharMistakeType>(j, CharMistakeType.None); for (int i = 1; i <= w_length; i++) { for (int j = 1; j <= cw_length; j++) { bool equal = correctedWord[j - 1] == word[i - 1]; int delCost = d[i - 1, j].Key + deletionCost; int insCost = d[i, j - 1].Key + insertionCost; int subCost = d[i - 1, j - 1].Key; if (!equal) subCost += substitutionCost; int transCost = int.MaxValue; if (transposition && i > 1 && j > 1 && word[i - 1] == correctedWord[j - 2] && word[i - 2] == correctedWord[j - 1]) { transCost = d[i - 2, j - 2].Key; if (!equal) transCost += transpositionCost; } int min = delCost; CharMistakeType mistakeType = CharMistakeType.Deletion; if (insCost < min) { min = insCost; mistakeType = CharMistakeType.Insertion; } if (subCost < min) { min = subCost; mistakeType = equal ? CharMistakeType.None : CharMistakeType.Substitution; } if (transCost < min) { min = transCost; mistakeType = CharMistakeType.Transposition; } d[i, j] = new KeyValuePair<int, CharMistakeType>(min, mistakeType); } } int w_ind = w_length; int cw_ind = cw_length; while (w_ind >= 0 && cw_ind >= 0) { switch (d[w_ind, cw_ind].Value) { case CharMistakeType.None: w_ind--; cw_ind--; break; case CharMistakeType.Substitution: result.Add(new Mistake(cw_ind - 1, CharMistakeType.Substitution)); w_ind--; cw_ind--; break; case CharMistakeType.Deletion: result.Add(new Mistake(cw_ind, CharMistakeType.Deletion)); w_ind--; break; case CharMistakeType.Insertion: result.Add(new Mistake(cw_ind - 1, CharMistakeType.Insertion)); cw_ind--; break; case CharMistakeType.Transposition: result.Add(new Mistake(cw_ind - 2, CharMistakeType.Transposition)); w_ind -= 2; cw_ind -= 2; break; } } if (d[w_length, cw_length].Key > result.Count) { int delMistakesCount = d[w_length, cw_length].Key - result.Count; for (int i = 0; i < delMistakesCount; i++) result.Add(new Mistake(0, CharMistakeType.Deletion)); } result.Reverse(); return result; }
рдЗрдВрдЯрд░рдлрд╝реЗрд╕
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ WinForms рдкрд░ рдЗрд╕ рдЙрдореНрдореАрдж рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЖрд╡реЗрджрди рдореЛрдиреЛ рдкрд░ рднреА рдЪрд▓реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди (Apache 2.0) рдХреЗ рд╕рд╛рдеред