有没有办法检测是否将不必要的字符添加到字符串中以绕过垃圾邮件检测?
Is there a way to detect if unnecessary characters are added to strings to bypass spam detection?
我正在构建一个简单的垃圾邮件分类器,粗略地查看我的数据集,大多数垃圾邮件在“垃圾邮件”字词之间放置空格,我认为这是为了让它们绕过垃圾邮件分类器。下面是一些示例:
- c 信用卡
- mort-gage
我希望能够将它们作为正确的单词在我的数据框中进行编码:
- 信用卡
- 房贷
顺便说一句,我正在使用Python。
这在很大程度上取决于您是否有所有垃圾词的列表。
如果您确实有一个垃圾词列表,并且您知道总是只有添加的空格(例如 give me your cred it card in formation
)但绝不会缺少空格(例如 give me yourcredit cardinformation
),那么你可以使用一个简单的 rule-based 方法:
import itertools
spam_words = {"credit card", "rolex"}
spam_words_no_spaces = {"".join(s.split()) for s in spam_words}
sentence = "give me your credit car d inform ation and a rol ex"
tokens = sentence.split()
for length in range(1, len(tokens)):
for t in set(itertools.combinations(tokens, length)):
if "".join(t) in spam_words_no_spaces:
print(t)
打印:
> ('rol', 'ex')
> ('credit', 'car', 'd')
所以首先创建一组所有垃圾词,然后为了更容易比较删除所有空格(尽管您可以调整方法以仅考虑正确间隔的垃圾词)。
然后将句子拆分成token,最后得到token列表中所有可能唯一的consequtive子序列(包括one-word序列和没有空格的整句),然后检查它们是否在垃圾邮件列表中单词。
如果您没有垃圾词列表,您最好的机会可能是对数据进行一般 whitespace-correction。查看 Optical Character Recognition (OCR) Post Correction which you can find some pretrained models for. Also check out this thread,它讨论了如何向无空格文本添加空格,甚至提到了一个 python 包。因此理论上您可以删除所有空格,然后尝试将其再次拆分为有意义的词,以增加发现垃圾词的机会。一般来说,你的问题(以及相反的,缺少空格)被称为单词边界检测,所以你可能想检查一些关于它的资源。
您还应该知道,现代预训练模型(例如常见的 Transformer 模型)经常使用 sub-token-level 嵌入未知词,这样它们仍然可以相对轻松地将所学知识结合起来进行拆分和 non-split 一个常用词的版本。
我正在构建一个简单的垃圾邮件分类器,粗略地查看我的数据集,大多数垃圾邮件在“垃圾邮件”字词之间放置空格,我认为这是为了让它们绕过垃圾邮件分类器。下面是一些示例:
- c 信用卡
- mort-gage
我希望能够将它们作为正确的单词在我的数据框中进行编码:
- 信用卡
- 房贷
顺便说一句,我正在使用Python。
这在很大程度上取决于您是否有所有垃圾词的列表。
如果您确实有一个垃圾词列表,并且您知道总是只有添加的空格(例如 give me your cred it card in formation
)但绝不会缺少空格(例如 give me yourcredit cardinformation
),那么你可以使用一个简单的 rule-based 方法:
import itertools
spam_words = {"credit card", "rolex"}
spam_words_no_spaces = {"".join(s.split()) for s in spam_words}
sentence = "give me your credit car d inform ation and a rol ex"
tokens = sentence.split()
for length in range(1, len(tokens)):
for t in set(itertools.combinations(tokens, length)):
if "".join(t) in spam_words_no_spaces:
print(t)
打印:
> ('rol', 'ex')
> ('credit', 'car', 'd')
所以首先创建一组所有垃圾词,然后为了更容易比较删除所有空格(尽管您可以调整方法以仅考虑正确间隔的垃圾词)。
然后将句子拆分成token,最后得到token列表中所有可能唯一的consequtive子序列(包括one-word序列和没有空格的整句),然后检查它们是否在垃圾邮件列表中单词。
如果您没有垃圾词列表,您最好的机会可能是对数据进行一般 whitespace-correction。查看 Optical Character Recognition (OCR) Post Correction which you can find some pretrained models for. Also check out this thread,它讨论了如何向无空格文本添加空格,甚至提到了一个 python 包。因此理论上您可以删除所有空格,然后尝试将其再次拆分为有意义的词,以增加发现垃圾词的机会。一般来说,你的问题(以及相反的,缺少空格)被称为单词边界检测,所以你可能想检查一些关于它的资源。
您还应该知道,现代预训练模型(例如常见的 Transformer 模型)经常使用 sub-token-level 嵌入未知词,这样它们仍然可以相对轻松地将所学知识结合起来进行拆分和 non-split 一个常用词的版本。