regex - 从大量文本中提取数千个简单模式的快速算法

标签 regex algorithm named-entity-extraction

我希望能够从 GB 的文本中有效地匹配数千个正则表达式,因为我知道这些正则表达式中的大多数都相当简单,例如:

\bBarack\s(Hussein\s)?Obama\b
\b(John|J\.)\sBoehner\b

等等

我目前的想法是尝试从每个正则表达式中提取某种最长的子字符串,然后使用 Aho-Corasick 匹配这些子字符串并消除大部分正则表达式,然后匹配所有剩余的正则表达式组合。谁能想到更好的东西?

最佳答案

您可以使用 (f)lex 生成 DFA,它并行识别所有文字。如果存在太多通配符,这可能会变得棘手,但它适用于多达大约 100 个文字(对于 4 个字母的字母表;对于自然文本可能更多)。您可能想要抑制默认操作 (ECHO),并且只打印匹配项的行号和列号。

[我假设 grep -F 的作用大致相同]

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

%%

"TTGATTCACCAGCGCGTATTGTC" { printf("@%d: %d:%s\n", yylineno, yycolumn, "OMG! the TTGA pattern again"  ); }


"AGGTATCTGCTTCAATCAGCG" { printf("@%d: %d:%s\n", yylineno, yycolumn, "WTF?!"  ); } 

... 
more lines
...

[bd-fh-su-z]+ {;}

[ \t\r\n]+ {;}

. {;}

%%

int main(void)
{
/* Call the lexer, then quit. */
yylex();
return 0;
}

可以使用 awk 或任何其他脚本语言从 txt 输入生成类似于上面的脚本。

关于regex - 从大量文本中提取数千个简单模式的快速算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8697456/

相关文章:

regex - 如何在给定的 $start-$end 范围内执行搜索和替换?

python - [^.]* 在正则表达式中是什么意思?

c# - 为什么径向树布局绘图算法会产生交叉边?

java - 用模数求解Java中的方程

python - 使用 Vowpal Wabbit 的命名实体识别似乎可以记住训练数据

java - 斯坦福基于精确字典的命名实体识别

php - 正则表达式帮助...php检查条目格式

jquery - 使用 javascript/jquery 查找链接目标是否为图像

Java:多维数组中的连续区域,用于实现一个拉丁方

java - 调整 StanfordCoreNLP 来处理嘈杂的网络文本?