查找文本中相邻子字符串的出现

亚历克斯

我有Word文档的文本和字符串数组。目的是查找文档文本中这些字符串的所有匹配项。我尝试在Aho-Corasick算法的C#实现中使用Aho-Corasick字符串匹配,但是默认实现不适合我。文字的典型部分看起来像

激活”是指实质上以附件A的形式从放款人向银行发出的书面通知。

激活通知”是指从贷款人到银行的书面通知,实质上是附件A和激活的形式。

工作日”是指银行开放以进行日常业务和激活通知的每一天(周六和周日除外)。

关键字数组看起来像

var keywords = new[] {"Activation", "Activation Notice"};

Aho-Corasick算法的默认实现返回以下次数

激活-4

激活通知-2

对于“激活说明”,这是正确的结果。但是对于“激活”,正确的计数也应该为2,因为我不需要考虑相邻关键字“激活通知”中的出现次数。

有适合这种情况的算法吗?

麦斯金纳

我将假设您根据链接的示例获得了结果。

StringSearchResult[] results = searchAlg.FindAll(textToSearch);

使用这些results,如果您假设唯一的重叠是子集,则可以按索引排序并在一次通过中收集所需的结果。

public class SearchResultComparer : IComparer<StringSearchResult> { 
    public int StringSearchResult(StringSearchResult x, StringSearchResult y) 
    { 
        // Try ordering by the start index.
        int compare = x.Index.CompareTo(y.Index);
        if (compare == 0)
        {
            // In case of ties, reverse order by keyword length.
            compare = y.Keyword.Length.CompareTo(x.Keyword.Length);
        }
        return compare;
    } 
} 

// ...


IComparer searchResultComparer = new SearchResultComparer();
Array.Sort(results, searchResultComparer); 

int activeEndIndex = -1;
List<StringSearchResult> nonOverlappingResults = new List<StringSearchResult>();
foreach(StringSearchResult r in results)
{
    if (r.Index < activeEndIndex)
    {
        // This range starts before the active range ends.
        // Since it's an overlap, skip it.
        continue;
    }

    // Save this result, track when it ends.
    nonOverlappingResults.Add(r);
    activeEndIndex = r.Index + r.Keyword.Length;
}

由于索引排序,该循环保证仅保留非重叠范围。但是某些范围将被拒绝。这只能由于两个原因而发生。

  1. 候选者的起始索引与有效范围相同。由于排序打破了这些联系,因此最长的走在最前面,因此候选者必须短于活动范围,并且可以跳过。
  2. 候选者在有效范围之后开始。由于唯一的重叠是子集,并且这与有效范围重叠,因此它是一个子集,其开始时间较晚,但仍在或之前结束。

因此,唯一被拒绝的候选者将是子集,并且必须在有效范围之前结束。因此,有效范围仍然是唯一需要担心与之重叠的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中查找子字符串

来自分类Dev

在字符串中查找子字符串

来自分类Dev

在HTML文本框中查找某些子字符串,然后将其替换为其他字符串

来自分类Dev

在大文本文件中查找字符串中子字符串的最后一次出现

来自分类Dev

在PyMongo中查找子字符串

来自分类Dev

从字符串输出中查找子字符串

来自分类Dev

在文本中查找相应的字符串

来自分类Dev

在字符串中查找子字符串

来自分类Dev

在python中查找大字符串中所有出现的子字符串的最快方法是什么

来自分类Dev

查找子字符串在字符串中连续出现的次数最多

来自分类Dev

在链接中查找子字符串

来自分类Dev

查找最长的相邻重复不重叠子字符串

来自分类Dev

在字符串中查找子字符串

来自分类Dev

查找文本中的字符串,但我也希望出现之前和之后的文本

来自分类Dev

在python中查找子字符串

来自分类Dev

在字符串中查找子字符串

来自分类Dev

在字符串中查找子字符串

来自分类Dev

从字符串中查找子字符串

来自分类Dev

查找重复的文本字符串,然后将重复的行与相邻单元格中的公用数字分组

来自分类Dev

在字符串中查找字符串的出现

来自分类Dev

在字符串中查找子字符串

来自分类Dev

在文件中查找子字符串

来自分类Dev

python在字符串中查找子字符串

来自分类Dev

Bash - 在字符串中查找子字符串

来自分类Dev

在属性中查找子字符串

来自分类Dev

使用 Python(相邻)在字符串中查找多个出现的字符串

来自分类Dev

javascript:在字符串中查找重复的(相邻和非相邻)字符

来自分类Dev

从字符串中查找有效出现的文本

来自分类Dev

在字符串中查找多个文本

Related 相关文章

热门标签

归档