Ответ 1
Приведенная логика усложняет программирование в T-SQL. Выберите язык, такой как С#. Сначала попробуйте сделать простое настольное приложение. Позже, если вы обнаружите, что загрузка всех записей в это приложение происходит слишком медленно, вы можете написать хранимую процедуру С#, которая выполняется на SQL-сервере. В зависимости от политики безопасности SQL-сервера он должен иметь сильный ключ.
Теперь алгоритм. Список исключенных слов обычно называют списком стоп-слов. Если вы выполняете поиск по поисковому запросу, вы можете найти список стоп-слов, с которых вы можете начать. Добавьте эти стоп-слова в HashSet<T>
(я буду использовать С# здесь)
HashSet<string> stopWords = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
string[] lines = File.ReadAllLines("C:\stopwords.txt");
foreach (string s in lines) {
stopWords.Add(s); // Assuming that each line contains one stop word.
}
Позже вы можете посмотреть, есть ли кандидат на ключевые слова в списке стоп-слов с помощью
If (!stopWords.Contains(candidate)) {
// We have a keyword
}
HashSets быстр. Они имеют время доступа O (1), что означает, что время, необходимое для поиска, не зависит от содержащихся в нем элементов.
Поиск ключевых слов можно легко выполнить с помощью Regex.
string text = ...; // Load text from DB
MatchCollection matches = Regex.Matches(text, "[a-z]([:']?[a-z])*",
RegexOptions.IgnoreCase);
foreach (Match match in matches) {
if (!stopWords.Contains(match.Value)) {
ProcessKeyword(match.Value); // Do whatever you need to do here
}
}
Если вы обнаружите, что a-z слишком ограничительно для букв и вам нужны буквы с акцентом, вы можете изменить выражение регулярного выражения на @"\p{L}([:']?\p{L})*"
. Класс символов \p{L}
содержит все модификаторы букв и букв.
Фразы более сложны. Сначала можно попытаться разбить текст на фразы, а затем применить поиск по ключевым словам для этих фраз вместо поиска ключевых слов во всем тексте. Это дало бы вам количество ключевых слов во фразе одновременно.
Разделение текста на фразы включает поиск предложений, заканчивающихся на "." или "?" или "!" или ":". Вы должны исключить точки и двоеточия, которые появляются в пределах слова.
string[] phrases = Regex.Split(text, @"[\.\?!:](\s|$)");
Здесь выполняется поиск прерываний, сопровождаемых пробелом или концом строки. Но я должен согласиться с тем, что это не идеально. Он может ошибочно обнаруживать сокращения в конце предложения. Вам нужно будет провести эксперименты, чтобы улучшить механизм расщепления.