在字符串中查找关键字和关键短语的算法
本文关键字:短语 算法 字符串 查找 关键字 | 更新日期: 2023-09-27 18:36:54
我需要有关如何编写算法的建议或指导,该算法将在字符串中找到关键字或关键字短语。
该字符串包含:
- 以英语 (GB) 编写的技术信息
- 单词大多用空格分隔
- 关键字不包含空格,但可能包含连字符、撇号、冒号等。
- 关键字可以包含空格、逗号或其他标点符号
- 如果两个或多个关键字一起出现,则很可能是一个关键字,例如"逆变器驱动"
- 文本还包含 HTML,但如有必要,可以事先将其删除
- 非关键字将是诸如"和","的","我们","看到","看"等词。 关键字
- 不区分大小写,例如"逆变器"和"逆变器"是相同的关键字
该算法具有以下要求:
- 在批处理场景中操作,例如每天运行一次或两次
- 处理长度从大约 200 到 7000 个字符不等的字符串
- 在不到 1 小时的时间内处理 1000 个字符串
- 将在功率中等好的服务器上执行
- 用以下语言之一编写:C#,VB.NET 或T-SQL,甚至可能是F#,Python或Lua等。
- 不依赖于预定义关键字或关键短语的列表
- 但可以依赖关键字排除列表,例如"和"、"the"、"go"等。
- 理想情况下可转移到其他语言,例如不依赖于特定于语言的功能,例如元编程 输出关键字列表(频率
- 降序),后跟关键字列表(频率降序)
如果它可以在几秒钟内处理多达 8000 个字符,那么它可以实时运行,那就太酷了,但我已经问得够多了!
只是在寻找建议和方向:
- 这应该被视为两个独立的算法吗?
- 是否有任何我可以遵循的既定算法?
- 我的要求可行吗?
非常感谢。
附言字符串将从SQL Server 2008 R2数据库中检索,因此理想情况下该语言将支持此功能,如果没有,那么它必须能够读/写STDOUT,管道,流或文件等。
所涉及的逻辑使得在 T-SQL 中编程变得复杂。选择一种语言,如 C#。首先尝试制作一个简单的桌面应用程序。稍后,如果发现将所有记录加载到此应用程序太慢,则可以编写在 SQL 服务器上执行的 C# 存储过程。根据 SQL 服务器的安全策略,它需要具有强密钥。
现在到算法。排除词列表通常称为停用词列表。如果你对这个搜索词进行一些谷歌搜索,你可能会找到你可以开始的停用词列表。将这些停用词添加到HashSet<T>
(我将在此处使用 C#)
// Assuming that each line contains one stop word.
HashSet<string> stopWords =
new HashSet<string>(File.ReadLines("C:'stopwords.txt"), StringComparer.OrdinalIgnoreCase);
稍后您可以查看关键字候选关键字是否在停用词列表中
If (!stopWords.Contains(candidate)) {
// We have a keyword
}
哈希集很快。它们的访问时间为 O(1),这意味着执行查找所需的时间不依赖于它包含的项数。
使用正则表达式可以轻松查找关键字。
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|$)");
这将搜索标点符号,后跟空格或行尾。但我必须同意,这并不完美。它可能会错误地将缩写检测为句子结尾。您必须进行实验以完善拆分机制。