Например есть массив стоп слов
var stops = new string[]
{
"район","р-н","город","г.","посёлок городского типа","п.г.т.","р.п.","рабочий посёлок","к.п.","курортный посёлок","к.","кишлак","пс","поселковый совет","сс","сельсовет",
"смн","сомон","вл.","волость","д.п.","дачный поселковый совет","п.","посёлок сельского типа","н.п.","населённый пункт","п.ст.","посёлок при станции","ж/д ст.",
"железнодорожная станция","с.","село","м.","местечко","д.","деревня","сл.","слобода","ст.","станция","ст-ца","станица","х.","хутор","у.","улус","рзд.","разъезд","клх",
"колхоз","свх","совхоз","зим.","зимовье"
};
От сервиса прилетает разный набор в строке, например может прилететь "деревня Новгородская" или "Нижний Новгород"
Как правильно реализовать чистку входящей строки от стоп слов?
Короче, если кратко, то в строке должно остаться только название населенного пункта.
Ответ
public static string Sanitize(string s)
{
var stops = new string[]
{
"район","р-н","город","г.","посёлок городского типа","п.г.т.","р.п.","рабочий посёлок","к.п.","курортный посёлок","к.","кишлак","пс","поселковый совет","сс","сельсовет",
"смн","сомон","вл.","волость","д.п.","дачный поселковый совет","п.","посёлок сельского типа","н.п.","населённый пункт","п.ст.","посёлок при станции","ж/д ст.",
"железнодорожная станция","с.","село","м.","местечко","д.","деревня","сл.","слобода","ст.","станция","ст-ца","станица","х.","хутор","у.","улус","рзд.","разъезд","клх",
"колхоз","свх","совхоз","зим.","зимовье"
};
stops = stops.OrderByDescending(st => st.Length).ToArray();
foreach (string stop in stops)
{
// не создавать каждый раз, кэшировать в статике!
Regex r = new Regex(@"(\s|^)" + Regex.Escape(stop) + @"(\s|$)");
s = r.Replace(s, "");
}
return s;
}
public static void Main(string[] args)
{
Console.WriteLine(Sanitize("деревня Новгородская"));
Console.WriteLine(Sanitize("посёлок городского типа Новгородский"));
}
Fiddle: https://dotnetfiddle.net/88YJ7X
Комментариев нет:
Отправить комментарий