在字符串中查找关键字和关键短语的算法

我需要有关如何编写算法的建议或指示,该算法将在字符串中找到关键字或关键字

该字符串包含:

  • 用英文写的技术信息(GB)
  • 单词大多由空格分隔
  • 关键字不包含空格,但可能包含连字符,撇号,冒号等。
  • 关键短语可能包含空格,逗号或其他标点符号
  • 如果两个或多个关键字一起出现,则可能是一个关键短语,例如“逆变器驱动”
  • 该文本还包含HTML,但如有必要,可以事先删除
  • 非关键字将是“and”,“the”,“we”,“see”,“look”等字样。
  • 关键字不区分大小写,例如“逆变器”和“逆变器”是相同的关键字

该算法具有以下要求:

  1. 批处理场景中操作,例如每天运行一次或两次
  2. 处理字符串的长度从大约200到7000个字符不等
  3. 在不到1小时内处理1000个字符串
  4. 将在具有中等功率的服务器上执行
  5. 写在以下之一: C#,VB.NET或T-SQL甚至可能是F#,Python或Lua等。
  6. 依赖于预定义关键字或关键短语列表
  7. 但可以依赖关键字排除列表,例如“和”,“the”,“go”等。
  8. 理想情况下可转换为其他语言,例如,不依赖于语言特定的function,例如元编程
  9. 输出关键短语列表(频率降序),后跟关键字列表(频率降序)

如果它可以在几秒钟内处理多达8000个字符,那将是非常酷的,因此它可以实时运行,但我已经足够了!

只是寻找建议和方向:

  • 这应该被视为两个独立的算法吗?
  • 有没有我可以遵循的既定算法?
  • 我的要求可行吗?

非常感谢。

PS将从SQL Server 2008 R2数据库中检索字符串,因此理想情况下该语言将支持此function,否则它必须能够读取/写入STDOUT,管道,流或文件等。

所涉及的逻辑使得在T-SQL中编程变得复杂。 选择像C#这样的语言。 首先尝试制作一个简单的桌面应用程序。 稍后,如果您发现将所有记录加载到此应用程序的速度太慢,您可以编写在SQL-Server上执行的C#存储过程。 根据SQL-Server的安全策略,它需要具有强密钥。


现在到算法。 排除的单词列表通常称为停用单词列表。 如果您对此搜索字词进行了一些Google搜索,您可能会找到可以开始使用的停用词列表。 将这些停用词添加到HashSet (我将在这里使用C#)

 // Assuming that each line contains one stop word. HashSet stopWords = new HashSet(File.ReadLines("C:\stopwords.txt"), StringComparer.OrdinalIgnoreCase); 

稍后您可以查看关键字候选词是否在停用词列表中

 If (!stopWords.Contains(candidate)) { // We have a keyword } 

HashSets很快。 它们的访问时间为O(1),这意味着执行查找所需的时间不依赖于它包含的项目数。

使用Regex可以轻松查找关键字。

 string text = ...; // Load text from DB MatchCollection matches = Regex.Matches(text, "[az]([:']?[az])*", RegexOptions.IgnoreCase); foreach (Match match in matches) { if (!stopWords.Contains(match.Value)) { ProcessKeyword(match.Value); // Do whatever you need to do here } } 

如果您发现az对字母的限制太多而需要重音字母,则可以将正则表达式更改为@"\p{L}([:']?\p{L})*" 。 字符类\p{L}包含所有字母和字母修饰符。

这些短语更复杂。 您可以尝试先将文本拆分为短语,然后对这些短语应用关键字搜索,而不是在整个文本中搜索关键字。 这将同时为您提供短语中关键字的数量。

将文本拆分为短语涉及搜索以“。”结尾的句子。 要么 ”?” 要么 ”!” 要么 ”:”。 您应该排除单词中出现的点和冒号。

 string[] phrases = Regex.Split(text, @"[\.\?!:](\s|$)"); 

这会在空格或行尾之后搜索标点符号。 但我必须同意这不完美。 它可能错误地将缩写检测为句末。 您将不得不进行实验以改进分裂机制。