我有一个关键字列表和一个文本来搜索他们。我需要在文本中得到每个找到的关键字的开始索引,匹配必须是精确的。例如:
keywords=>cat,dog
text=> a catchy cat with a dogged dog在这里,只有“猫”和“狗”匹配索引必须返回,匹配不应该与‘吸引’和‘狗’这样的词。
我试过一种用于字符串匹配的算法,但它也与“吸引人”和“固执”相匹配。如何准确匹配关键字并使用c#返回文本中的索引位置
发布于 2013-10-24 10:36:22
用正则表达式表示边界..。
var results= keywords.Select(x=>
new
{
word=x,
indexes=Regex.Matches(input,@"\b"+x+@"\b")
.Cast<Match>().Select(y=>y.Index)
.ToList()
}
);现在可以对结果进行迭代。
foreach(var match in results)
{
match.word;
foreach(int index in match.indexes)//index
}发布于 2013-10-24 11:16:42
你可以用Aho算法做一些修改。对于所有关键字,将单词分隔符(如空格、点、换行符等)附加到每个关键字的末尾。
因此,如果您有m个关键字,文本有n个类型的分隔符,那么您将从n*m单词构建trie树。
在附加分离器后,它将不匹配‘吸引’和‘坚持’在你的样品箱。
编辑:
首先,您最好对AC算法有一个了解。
示例:
keywords=>cat,text=>,一只带着狗狗的猫
现在更改关键字=>‘cat ',’狗','cat\n',‘狗\n’(只是附加空格和换行符)
更改文本=>‘一只带着狗狗的猫’
然后,您可以使用算法来查找每个关键字的每个索引。
假设文本长度为n,关键词总长度为m,则Aho算法具有O(n+m)复杂度,足以满足大文本和大关键字集的要求。
发布于 2013-10-24 11:21:12
希望下面的函数将返回每个关键字的索引列表。
private List<int> GetIndexForKeyWord(string content,string key)
{
int index = 0;
List<int> indexes=new List<int>();
while (index < content.Length && index >= 0)
{
index = content.IndexOf(key, index);
if (index+key.Length==content.Length||index >= 0 && !char.IsLetter(content[index + key.Length]))
{
indexes.Add(index);
}
if(index!=-1)
index++;
}
return indexes;
}https://stackoverflow.com/questions/19563495
复制相似问题