.NET рдХреЗ рд▓рд┐рдП рдпрд╛рдВрдбреЗрдХреНрд╕ рднрд╛рд╖рд╛рд╡рд┐рдЬреНрдЮрд╛рди рдПрдкреАрдЖрдИ

рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд╕рдореНрдореЗрд▓рди 2013 рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ .NET рдХреЗ рддрд╣рдд рд╕рднреА рдпреИрдВрдбреЗрдХреНрд╕ рднрд╛рд╖рд╛ рд╡рд┐рдЬреНрдЮрд╛рди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЧреЛрдЧреНрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рдереЗ ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рднреА рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рд░реЗрд╕реНрдЯрд░реНрд╢рдк , рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЧрд┐рддреВрдм рдХрд╛рд░реНрдпреЛрдВ (рдЬрд╛рд░реАрдХрд░реНрддрд╛, рд░рд┐рд▓реАрдЬ, рдорд╛рд░реНрдХрдбрд╛рдЙрди, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЖрдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╡рд┐рд╖рдп рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛ред

рддреБрд░рдВрдд рдореИрдВ GitHub рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рдлреЗрдВрдХ рджреЗрддрд╛ рд╣реВрдВ: рдХреЛрдб , рдмрд╛рдЗрдирд░реА

рдПрдкреАрдЖрдИ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛




RestSharp рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP GET рдФрд░ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА XML рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ XML рдпрд╛ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ .NET рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ (XML рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдбреЗрдореЗрд░реБ - рд▓реЗрд╡реЗрдВрд╕рд╣рд╛рдЗрдЯ рджреВрд░реА рдЧрдгрдирд╛ рдлрд╝рдВрдХреНрд╢рди


рд╕реНрдкреЗрд▓рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рди рдХреЗрд╡рд▓ рдкрд╛рда рдХрд╛ рдПрдХ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рдмрд▓реНрдХрд┐ рдЙрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рднреА рдереАрдВред рд▓реЗрд╡рд┐рдВрд╕реНрдЯреАрди рдХреА рджреВрд░реА рдХрд╛ рдЦреНрдпрд╛рд▓ рддреБрд░рдВрдд рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐:

рдкрд╣рд▓рд╛ рджреЛрд╖ рджрд╛рдореЗрд░реБ - рд▓реЗрд╡реЗрдиреНрд╢рд┐рди рджреВрд░реА рджреНрд╡рд╛рд░рд╛ рдСрдлрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рд╛рдкреНрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ (рджреВрд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдореЗрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреБрд▓ рджреВрд░реА рд╣реЛрдЧреАред )ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЧрд▓рдд (рд╢рдмреНрдж) рдФрд░ рд╕рд╣реА (рд╕реБрдзрд╛рд░) рд╢рдмреНрджреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рднрд┐рдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╡рдЬрди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдХрд╛ рд╡рдЬрди рдПрдХ рд╕рдорд╛рди рд╣реИ)ред

рджрдорд░реЗрдЙ - рд▓реЗрд╡реЗрдиреНрд╢рд┐рди рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреЛрдб
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) рдХреЗ рд╕рд╛рдеред

Source: https://habr.com/ru/post/In204372/


All Articles