我有一个关键字列表和一个搜索它们的文本。我需要获取文本中每个找到的关键字的起始索引,并且匹配必须准确。例如:
keywords=>cat,dog
text=> a catchy cat with a dogged dog
此处只匹配'cat'和'dog'匹配索引必须返回,匹配不应该是'catchy'和'dogged'之类的单词
我尝试了Aho-Corasick Algorithm for string matching,但它也匹配'吸引人'和'顽固'。如何使用c#
对关键字进行精确匹配并返回文本中的索引位置答案 0 :(得分:3)
将正则表达式用于边界..
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
}
答案 1 :(得分:1)
您可以使用Aho-Corasick算法进行一些修改。 对于所有关键字,请在每个关键字的末尾添加单词分隔符(例如空格,点,换行符等)。
因此,如果您有m个关键字并且文本有n种类型的分隔符,您将从n * m个单词构建trie树。
在附加分隔符后,它将不匹配示例中的'catchy'和'dogged'。
编辑:
首先,您最好了解AC算法。
示例:
keywords =&gt; cat,dog and text =&gt;一只带有顽固狗的吸引人的猫
现在更改了keywords =&gt;'cat','dog','cat \ n','dog \ n'(只是追加空格和换行符分隔符)
更改了text =&gt;'带有顽固狗的吸引人的猫\ n'
然后你可以使用标准的Aho-Corasick算法来查找每个关键词的每个索引。
假设文本的长度为n,并且总长度关键字为m,则Aho-Corasick算法具有O(n + m)复杂度,足以用于大文本和大型关键字集。
答案 2 :(得分:0)
希望下面的函数会返回每个关键字的索引列表。
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;
}
答案 3 :(得分:0)
按字词拆分文字并将所有字词推入Dictionary<word, index>
并查找每个关键字的字典。