Поиск фразы в массиве слов
Весь мозг сломал, ничего в голове не приходит, как это реализовать программно на C#.
Ответы (2 шт):
Автор решения: Pavel Popov
→ Ссылка
Ну, примерно так. Можно еще добавить фильтр на дубликаты, но это уже сами :-)
var pattern = "Автоматические ворота";
var phrases = new []{ "Автоматические ворота", "автоматические ворота купить", "Автоматические ворота каталог всех", "Автоматические подъемные ворота","просто ворота" };
var patternWords = pattern.Split(' ');
var tempResult = phrases.Where(x => patternWords.All(p => x.Contains(p, StringComparison.OrdinalIgnoreCase)))
.ToArray();
Console.Write($"{pattern}");
foreach (var phrase in tempResult)
{
var words = phrase.Split(' ')
.Where(x => !patternWords.Any(p => x.Contains(p, StringComparison.OrdinalIgnoreCase)))
.ToArray();
if(!words.Any())
continue;
Console.Write($", {string.Join(", ", words)}");
}
Автор решения: tym32167
→ Ссылка
разбиваем на токены, пару раз группируем, получаем
string str = @"
Автоматические ворота
Автоматические ворота купить
Автоматические ворота каталог
Автоматические ворота цена
Где купить автоматические ворота
Автоматические гаражные ворота
Автоматические подъемные ворота
";
var lines = str.Split(new[] { Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries).Distinct().ToArray();
var linesByTokens = lines
.ToDictionary(x => x,
x => new HashSet<string>(x.ToLower().Split(new[] { " " },
StringSplitOptions.RemoveEmptyEntries)));
var tokensCount = linesByTokens.Values
.SelectMany(x => x).GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());
var topLine = linesByTokens
.Where(x => x.Value.All(t => tokensCount[t] == lines.Length))
.FirstOrDefault();
foreach (var line in lines)
{
if (string.Compare(line, topLine.Key) == 0)
Console.WriteLine($"{line}, {string.Join(", ", tokensCount.Keys.Except(linesByTokens[line]))}");
else Console.WriteLine(line);
}
Вывод
Автоматические ворота, купить, каталог, цена, где, гаражные, подъемные
Автоматические ворота купить
Автоматические ворота каталог
Автоматические ворота цена
Где купить автоматические ворота
Автоматические гаражные ворота
Автоматические подъемные ворота