正则表达式有助于从字符串中删除干扰词或停用词
Posted
技术标签:
【中文标题】正则表达式有助于从字符串中删除干扰词或停用词【英文标题】:RegEx help to remove noise words or stop words from string 【发布时间】:2011-10-12 09:43:51 【问题描述】:我想从输入标签(字符串)中删除所有噪声标签 标签用逗号分隔。如果干扰词是大标签的一部分,它将保留。
这是我有但不工作的:
string input_string = "This,sure,about,all of our, all, values";
string stopWords = "this|is|about|after|all|also";
stopWords = string.Format(@"\s?\b(?:0)\b\s?", stopWords);
string tags = Regex.Replace(input_string, stopWords, "", RegexOptions.IgnoreCase);
这就是我想要从上面的输入中得到的: ",当然,,我们所有的,,价值观"
“This”、“about”、“all”这些词将被替换为“”,因为它们是干扰词。 但是“我们的所有”将保留,即使其中包含“所有”这个干扰词。 这是因为逗号是标签边界
谁能帮帮我?
我有一个替代解决方案,将干扰词放入字典,然后搜索输入字符串中的每个词。但我更喜欢 RegEx 方法。
【问题讨论】:
【参考方案1】: var input = "This,sure,about,all of our, all, values";
var stopWords = new Regex("^(this|is|about|after|all|also)$");
var result = String.Join(",", input.Split(',').
Where(x => !stopWords.IsMatch(x.Trim())));
【讨论】:
代表的表现如何? Replace() 会比使用委托更快,不是吗? 可能。但是“过早的优化是万恶之源”。优化后的代码往往是神秘的。 这行得通。此外,我对通过委托处理的每个标签都有更多的控制权。尽管它可能无法以最佳方式执行。但是好吧,我平均会有 5-7 个标签。【参考方案2】:试试
stopWords = string.Format(@"(?<=^|,)\s*(?:0)\s*(?=$|,)", stopWords);
这使用lookbehind (?<=)
来确定前面的,或字符串的开头,并使用lookahead (?=)
来确定尾部的,。我还删除了单词边界 \b
代码,因为它不需要,并将您的可选空格 \s?
替换为 \s*
以匹配 0 个或多个空格。
你可以把 * 改回 ?如果你真的是指最多一个空格。
【讨论】:
用户可以在字符串的任意位置输入任意数量的空格。如果您的解决方案有效,那将会很酷。正在尝试测试... 我试过 stopWords = string.Format(@"(? 真的很困惑为什么这对你不起作用我通过 expresso 运行This,sure,about,all of our, all, values
并得到 ,sure,,all of our,, values
【参考方案3】:
我不喜欢使用 Regex 来处理任务,所以我将提供一个替代解决方案,您可以决定是否要使用它。
string[] inputWords = input_string.Split(',');
string tags = "";
foreach(string s in inputWords)
if(!storWords.Contains(s.ToLowerInvariant()))
tags += s + ",";
tags = tags.TrimEnd(',');
//tags = "sure,all of our,values"
【讨论】:
我已经有类似的解决方案在工作。对此不感兴趣。 @Projapati,如果您不想使用,那很好。但是,当您已经有了可行的解决方案时,我看不出为什么要更改为 Regex 解决方案(甚至无法开始工作)?您是否认为正则表达式很神奇?你不觉得Regex在幕后也要做类似的事情吗?以上是关于正则表达式有助于从字符串中删除干扰词或停用词的主要内容,如果未能解决你的问题,请参考以下文章