我需要关于如何编写一个算法的建议或指导,该算法将在字符串中找到关键字或键短语。
字符串包含:
用英语(GB)编写的技术信息( punctuation
H 111AE 112关键字可以包含空格,逗号或其他necessary
E 217,然后很可能是短语关键字,例如H 218H 119文本也包含HTML,但如果necessary
。
该算法有以下要求:
在batch-processing场景中运行
。
这将是额外的酷,如果它可以处理多达8000字符在几秒钟内,以便它可以在实时运行,但我已经问够了!
只是在寻求建议和指导:
这应该被看作是两个独立的algorithms?
非常感谢。
P.S.字符串将从Server 2008 R2数据库中检索,因此理想情况下,该语言将对此提供支持,如果不支持,则必须能够读写STDOUT、管道、流或文件等。
发布于 2012-06-12 23:31:11
所涉及的逻辑使得在T中编程变得复杂.选择一种像C#这样的语言。首先,尝试制作一个简单的桌面应用程序。稍后,如果发现将所有记录加载到此应用程序太慢,则可以编写在Server上执行的C#存储过程。根据Server的安全策略,它需要有一个强键。
到现在的算法。排除词的列表通常称为停止词列表。如果你对这个搜索词做了一些搜索,你可能会找到停止词列表,你可以开始。将这些停止词添加到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
}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
}
}如果发现and对字母的限制太大,需要重音字母,则可以将regex表达式更改为@"\p{L}([:']?\p{L})*"。字符类\p{L}包含所有字母和字母修饰符。
这些短语更复杂。您可以尝试先将文本分割成短语,然后在这些短语上应用关键字搜索,而不是在整个文本中搜索关键字。这将在同一时间给出一个短语中关键字的数量。
将课文分成短语包括搜索以“”结尾的句子。或者"?“或者"!“或":“。你应该排除一个单词中出现的点和冒号。
string[] phrases = Regex.Split(text, @"[\.\?!:](\s|$)");这种搜索标点符号后要么是空格,要么是行尾。但我必须承认,这并不完美。它可能错误地将缩略语作为句尾。你将不得不做实验,以完善分裂机制。
https://stackoverflow.com/questions/11005687
复制相似问题