首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字符串中查找关键字和关键字的算法

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

Stack Overflow用户
提问于 2012-06-12 22:18:31
回答 1查看 13.9K关注 0票数 12

我需要关于如何编写一个算法的建议或指导,该算法将在字符串中找到关键字或键短语

字符串包含:

用英语(GB)编写的技术信息( punctuation

  • If

  • )主要由空格(

  • )分隔--关键字不包含空格,但它可能包含连字符、撇号、冒号等。

H 111AE 112关键字可以包含空格,逗号或其他necessary

  • Non-keywords <代码>E 116两个或多个关键字一起出现E 217,然后很可能是短语关键字,例如H 218H 119文本也包含HTML,但如果necessary

  • Non-keywords像“和”这样的词,则可以提前删除,“”、“我们”、“见”、“看”etc.

  • Keywords是不区分大小写的。“逆变器”和“逆变器”是相同的关键字

该算法有以下要求:

batch-processing场景中运行

  1. ,例如,每天运行一两次
  2. 进程字符串,长度大约从200到7000 characters
  3. Process 1000字符串不等,在一台服务器上执行的字符串少于1 hour
  4. Will,其中之一的power
  5. Written比较好:C#、VB.NET或twice (甚至F# ),Python或Lua etc.
  6. Does非依赖于预定义的关键字列表,或者keyphrases
  7. But 依赖于关键字排除列表,例如"and“、"the”、"go“etc.
  8. Ideally可转移到其他语言,例如不依赖于特定于语言的特性,例如metaprogramming
  9. Output、键短语列表(频率的降序)和关键字列表(频率的降序)

这将是额外的酷,如果它可以处理多达8000字符在几秒钟内,以便它可以在实时运行,但我已经问够了!

只是在寻求建议和指导:

这应该被看作是两个独立的algorithms?

  • Are,有什么我可以遵循的建立的算法吗?

  • 是可行的吗?

非常感谢。

P.S.字符串将从Server 2008 R2数据库中检索,因此理想情况下,该语言将对此提供支持,如果不支持,则必须能够读写STDOUT、管道、流或文件等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-12 23:31:11

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

到现在的算法。排除词的列表通常称为停止词列表。如果你对这个搜索词做了一些搜索,你可能会找到停止词列表,你可以开始。将这些停止词添加到HashSet<T>中(我将在这里使用C# )

代码语言:javascript
复制
// Assuming that each line contains one stop word.
HashSet<string> stopWords =
    new HashSet<string>(File.ReadLines("C:\stopwords.txt"), StringComparer.OrdinalIgnoreCase);

稍后,您可以查看关键字候选是否在“停止单词”列表中。

代码语言:javascript
复制
If (!stopWords.Contains(candidate)) {
    // We have a keyword
}

HashSets是快速的。它们的访问时间为O(1),这意味着进行查找所需的时间不取决于它包含的项目数。

查找关键字可以很容易地用Regex完成。

代码语言:javascript
复制
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}包含所有字母和字母修饰符。

这些短语更复杂。您可以尝试先将文本分割成短语,然后在这些短语上应用关键字搜索,而不是在整个文本中搜索关键字。这将在同一时间给出一个短语中关键字的数量。

将课文分成短语包括搜索以“”结尾的句子。或者"?“或者"!“或":“。你应该排除一个单词中出现的点和冒号。

代码语言:javascript
复制
string[] phrases = Regex.Split(text, @"[\.\?!:](\s|$)");

这种搜索标点符号后要么是空格,要么是行尾。但我必须承认,这并不完美。它可能错误地将缩略语作为句尾。你将不得不做实验,以完善分裂机制。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11005687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档