正则表达式/启发式检测重复词,例如"gfgfgfgf" "dadadada" "sdsdsd"
regex / heuristic to detect repetitive words e.g. "gfgfgfgf" "dadadada" "sdsdsd"
我们如何使用正则表达式搜索单词中的重复模式以检测“垃圾”或虚拟单词,例如“gfgfgfgfg”和类似单词,但不限制 创意 像“aweeesssoome”、“omggg”等词
示例:
在“gfgfgfgfg”的情况下正则表达式搜索/检测/结果应该是肯定的(检测到“gf”基础模式,最终构造整个单词,注意“悬挂”最后一个字符“g”)
在单词“aweesoooomee”的情况下,它应该 return 为假,因为没有使用重复模式来构造 整个单词.
重新 可能重复 由 rsjaffe 标记:
我post在regex101.com上link的问题Detect repetitions in string has a generic and not so "smart" solution I am looking for. As explained above, the solution / variation I'm currently using considerably reduces false positives detection. Simple test可以作为证据,看看为什么不满足我的要求。
补充说明:
上述方法也检测相邻单词的重复,并限制创造性(“有效”)单词,这不是理想的效果。
示例:
“this is”——将“is”检测为 2 个单独单词中的重复(“is is”模式匹配)。
"awesoooommeee" -- 检测重复的单个字母,如“o”、“m”和“e”。
搜索这个解决方案有点难找,所以我不得不问这个问题。
首先,介绍一些背景故事:
- 我运行一个博客
- 我有一个 post 关于 reCaptcha
- 有时(大约每周一次)有人试图搞笑并 post 垃圾评论的形式与此类似:
gfgfgfgf
sdsdsdsds
dadadada
你明白了。他们是在测试自动 reCaptcha 绕过系统作为概念证明还是只是想搞笑,我不知道也不关心(很可能两者兼而有之)。
(edit) 有趣的是,没有其他 post 受到此类垃圾评论的影响。
但是,考虑到这一点,检测这些评论具有的(大部分)单个词中的模式 (99%) 并防止这些评论 posting 应该是相对简单和容易的。听起来很简单?
但是,它也必须足够好以避免误报。
例如,如果一条评论像上面那样有一个重复的单词,那么它肯定是垃圾邮件。
另一方面,如果它只是在正常句子的中间有一个拼写错误,它应该通过。
现在,我已经可以 'hear' 在下面评论为什么不使用 Akismet。或解决方案 X。或解决方案 Y。为什么不用像 Disqus 或 Facebook 评论 这样的外部评论系统。因为,我做不到。它必须在内部。我希望简单。我已经有一些东西可以防止大量垃圾,但对于这个特殊情况,它们都失败了。
目前我测试过的解决方案:
这是一个正则表达式示例,是此答案的变体 here,但并不完美:
(.+\w)(?=+)/gu
它的问题在于,在下面的示例中,它大部分时间都会通过,但它也会触发误报:
correct/proper检测:
123123123123
daddaddaddad
sadsadasad
sadsadsad
121212121
sasasasasas
sdsdsdsds
dsdsdsdsd
ffffffff
blahblah
ioiooioioioi
popopopopop
Hi I dont think this is a spam.
improper/incorrect检测(误报):
I loooovve this. It's awesooooommeee!
现在,这很棘手。过滤器完全按照指示执行,但是,“ooovv”和“oooommeee”模式在与上面列出的第一个模式(“gfgfgfgf”等)相同的意义上并不完全重复。过滤器检测到“oo”模式重复。是的,正确,但不完全是我想要的目标。
有谁知道如何改进此正则表达式检测使其更智能一点?
谢谢!
我终于解决了!并使用单个正则表达式行:)
正在搜索 正则表达式检测重复字符串 我找到了所需的线索。
这个问题:Matching on repeated substrings in a regex and the particular answer 激发了我找到解决方案的灵感。
解决方案是使用 capturing groups 和 backreference 在对上述原始答案稍作修改的正则表达式中使用,以便同时包含字母和号码:
^([a-z0-9]{2,}).*()$/gumi
示例:https://regex101.com/r/xG40cL/1
上述解决方案的另一种变体是包含单个字符,这样具有偶数个字符和奇数个字符(偶数和奇数对称)的单词也将被匹配(例如 "ooo"、"iii"等):
^([a-z0-9]{1,}).*()$/gumi
示例:https://regex101.com/r/m9aqNk/1
虽然还不完美,但肯定更好,更接近理想状态。
对不起大家这么痛苦,因为现在我明白了我正在寻找的关于正则表达式的正确术语(它叫做 backreference)。
我们如何使用正则表达式搜索单词中的重复模式以检测“垃圾”或虚拟单词,例如“gfgfgfgfg”和类似单词,但不限制 创意 像“aweeesssoome”、“omggg”等词
示例:
在“gfgfgfgfg”的情况下正则表达式搜索/检测/结果应该是肯定的(检测到“gf”基础模式,最终构造整个单词,注意“悬挂”最后一个字符“g”)
在单词“aweesoooomee”的情况下,它应该 return 为假,因为没有使用重复模式来构造 整个单词.
重新 可能重复 由 rsjaffe 标记:
我post在regex101.com上link的问题Detect repetitions in string has a generic and not so "smart" solution I am looking for. As explained above, the solution / variation I'm currently using considerably reduces false positives detection. Simple test可以作为证据,看看为什么不满足我的要求。
补充说明:
上述方法也检测相邻单词的重复,并限制创造性(“有效”)单词,这不是理想的效果。
示例:
“this is”——将“is”检测为 2 个单独单词中的重复(“is is”模式匹配)。
"awesoooommeee" -- 检测重复的单个字母,如“o”、“m”和“e”。
搜索这个解决方案有点难找,所以我不得不问这个问题。
首先,介绍一些背景故事:
- 我运行一个博客
- 我有一个 post 关于 reCaptcha
- 有时(大约每周一次)有人试图搞笑并 post 垃圾评论的形式与此类似:
gfgfgfgf
sdsdsdsds
dadadada
你明白了。他们是在测试自动 reCaptcha 绕过系统作为概念证明还是只是想搞笑,我不知道也不关心(很可能两者兼而有之)。
(edit) 有趣的是,没有其他 post 受到此类垃圾评论的影响。
但是,考虑到这一点,检测这些评论具有的(大部分)单个词中的模式 (99%) 并防止这些评论 posting 应该是相对简单和容易的。听起来很简单?
但是,它也必须足够好以避免误报。
例如,如果一条评论像上面那样有一个重复的单词,那么它肯定是垃圾邮件。
另一方面,如果它只是在正常句子的中间有一个拼写错误,它应该通过。
现在,我已经可以 'hear' 在下面评论为什么不使用 Akismet。或解决方案 X。或解决方案 Y。为什么不用像 Disqus 或 Facebook 评论 这样的外部评论系统。因为,我做不到。它必须在内部。我希望简单。我已经有一些东西可以防止大量垃圾,但对于这个特殊情况,它们都失败了。
目前我测试过的解决方案:
这是一个正则表达式示例,是此答案的变体 here,但并不完美:
(.+\w)(?=+)/gu
它的问题在于,在下面的示例中,它大部分时间都会通过,但它也会触发误报:
correct/proper检测:
123123123123
daddaddaddad
sadsadasad
sadsadsad
121212121
sasasasasas
sdsdsdsds
dsdsdsdsd
ffffffff
blahblah
ioiooioioioi
popopopopop
Hi I dont think this is a spam.
improper/incorrect检测(误报):
I loooovve this. It's awesooooommeee!
现在,这很棘手。过滤器完全按照指示执行,但是,“ooovv”和“oooommeee”模式在与上面列出的第一个模式(“gfgfgfgf”等)相同的意义上并不完全重复。过滤器检测到“oo”模式重复。是的,正确,但不完全是我想要的目标。
有谁知道如何改进此正则表达式检测使其更智能一点?
谢谢!
我终于解决了!并使用单个正则表达式行:)
正在搜索 正则表达式检测重复字符串 我找到了所需的线索。
这个问题:Matching on repeated substrings in a regex and the particular answer 激发了我找到解决方案的灵感。
解决方案是使用 capturing groups 和 backreference 在对上述原始答案稍作修改的正则表达式中使用,以便同时包含字母和号码:
^([a-z0-9]{2,}).*()$/gumi
示例:https://regex101.com/r/xG40cL/1
上述解决方案的另一种变体是包含单个字符,这样具有偶数个字符和奇数个字符(偶数和奇数对称)的单词也将被匹配(例如 "ooo"、"iii"等):
^([a-z0-9]{1,}).*()$/gumi
示例:https://regex101.com/r/m9aqNk/1
虽然还不完美,但肯定更好,更接近理想状态。
对不起大家这么痛苦,因为现在我明白了我正在寻找的关于正则表达式的正确术语(它叫做 backreference)。