在互联网上,由于一些政策法规,需要对一些帖子或者聊天记录进行关键字屏蔽,本文使用KMP模式匹配算法,将目标串S中的敏感词汇全部替换成*。
实际应用中需要一个屏蔽词库,需将每个屏蔽词条作为模式串T,分别过滤一次S串。
考虑到屏蔽词库中有相同前缀的屏蔽词,比如:“朱令”和“朱令案”,所以可以预先将屏蔽词库中的屏蔽词按照长度做由大到小的排序。先过滤长词,再过滤短词即可。
int getNext(char* s, int next[]) {
next[0] = -1;
int i = -1;
int j = 0;
while (j < strlen(s)) {
if (i == -1 || s[i] == s[j]) {
i++;
j++;
next[j] = i;
} else {
i = next[i];
}
}
return 0;
}
int kmp(char* str, char* t, int next[]) {
int j = 0;
int i = 0;
while (str[i] != '\0' && t[j] != '\0' && strlen(str) - i >= strlen(t) - j) {
if (str[i] == t[j]) {
i++;
j++;
} else {
j = next[j];
if (j == -1) {
i++;
j++;
}
}
if (t[j] == '\0') {
i = i - j;
return i;
}
}
return -1;
}
int fillStar(char* p, int len) {
int i = 0;
while (i < len) {
p[i] = '*';
i++;
}
return 0;
}
int filter(char* s, char* t) {
int len = strlen(t);
int next[LEN];
getNext(t, next);
char* p = s;
while (p != '\0') {
int loc = kmp(p, t, next);
if (loc >= 0) {
fillStar(p + loc, len);
p = (p + loc + len);
} else {
return 0;
}
}
}
转载自 http://blog.youkuaiyun.com/li4951/article/details/8962056