gpt4 book ai didi

python - 将文本与模板进行比较以检测异常(反向模板)

转载 作者:太空狗 更新时间:2023-10-29 20:56:37 25 4
gpt4 key购买 nike

我正在寻找一种算法甚至算法空间来处理验证短文本(电子邮件)是否与已知模板匹配的问题。编码可能是 python 或 perl,但这很灵活。

问题是:

能够访问生产数据的服务器需要能够发送将到达 Internet 的电子邮件:

Dear John Smith,

We received your last payment for $123.45 on 2/4/13. We'd like you to be aware of the following charges:
$12.34 Spuznitz, LLC on 4/1
$43.21 1-800-FLOWERS on 4/2
As always, you can view these transactions in our portal.
Thank you for your business!

显然,某些电子邮件内容会有所不同 - 称呼(“John Smith”)、“$123.45 on 2/4/13”以及打印出的交易行。其他部分(“我们收到了您的最后一笔付款”)非常静态。我希望能够匹配文本的静态部分并量化动态部分是否在某些合理的范围内(例如,我可能知道要打印的最多交易行是 5 个)。

因为我担心数据泄露,我想确保与此模板不匹配的电子邮件永远不会外泄 - 我想检查电子邮件并隔离任何看起来不像我预期的东西。因此,我需要自动执行此模板匹配并阻止任何远离匹配的电子邮件。

那么问题来了,去哪里找过滤机制呢?贝叶斯过滤试图验证特定消息和非特定语料库之间的足够相似性,这是一种相反的问题。诸如 Perl 的模板模块之类的东西是紧密匹配的——但用于输出,而不用于输入或比较。简单的“差异”类型比较无法很好地处理有限的动态信息。

我如何测试这些外发电子邮件消息是否“嘎嘎作响”?

最佳答案

您可以使用文法进行紧密匹配。可以在语法中组织正则表达式以便于抽象:http://www.effectiveperlprogramming.com/blog/1479

或者您可以使用专用的语法引擎 Marpa

如果您想要更统计的方法,请考虑 n-grams 。首先,标记文本并用有意义的占位符替换变量 block ,例如 CURRENCYDATE。然后,构建n-grams。现在您可以使用 Jaccard index 来比较两个文本。

这是一个适用于三元组的 Pure-Perl 实现:

#!/usr/bin/env perl
use strict;
use utf8;
use warnings;

my $ngram1 = ngram(3, tokenize(<<'TEXT1'));
Dear John Smith,

We received your last payment for $123.45 on 2/4/13. We'd like you to be aware of the following charges:
$12.34 Spuznitz, LLC on 4/1
$43.21 1-800-FLOWERS on 4/2
As always, you can view these transactions in our portal.
Thank you for your business!
TEXT1

my $ngram2 = ngram(3, tokenize(<<'TEXT2'));
Dear Sally Bates,

We received your last payment for $456.78 on 6/9/12. We'd like you to be aware of the following charges:
$123,43 Gnomovision on 10/1
As always, you can view these transactions in our portal.
Thank you for your business!
TEXT2

my %intersection =
map { exists $ngram1->[2]{$_} ? ($_ => 1) : () }
keys %{$ngram2->[2]};
my %union =
map { $_ => 1 }
keys %{$ngram1->[2]}, keys %{$ngram2->[2]};

printf "Jaccard similarity coefficient: %0.3f\n", keys(%intersection) / keys(%union);

sub tokenize {
my @words = split m{\s+}x, lc shift;

for (@words) {
s{\d{1,2}/\d{1,2}(?:/\d{2,4})?}{ DATE }gx;
s{\d+(?:\,\d{3})*\.\d{1,2}}{ FLOAT }gx;
s{\d+}{ INTEGER }gx;
s{\$\s(?:FLOAT|INTEGER)\s}{ CURRENCY }gx;
s{^\W+|\W+$}{}gx;
}

return @words;
}

sub ngram {
my ($size, @words) = @_;
--$size;

my $ngram = [];
for (my $j = 0; $j <= $#words; $j++) {
my $k = $j + $size <= $#words ? $j + $size : $#words;
for (my $l = $j; $l <= $k; $l++) {
my @buf;
for my $w (@words[$j..$l]) {
push @buf, $w;
}
++$ngram->[$#buf]{join(' ', @buf)};
}
}

return $ngram;
}

您可以使用一个文本作为模板并将其与您的电子邮件进行匹配。检查 String::Trigram 以获得有效的实现。 Google Ngram Viewer 是一个很好的资源来说明 n-gram 匹配。

关于python - 将文本与模板进行比较以检测异常(反向模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com