余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

自然语言处理(NLP)如何分辨炸鸡、泰迪和垃圾邮件?

xiyangw 2023-09-17 16:16 10 浏览 0 评论

作为人类,我们对做出决断已经习以为常。我们经常会依据一些给出的信息来做决断。那你是如何将这些“信息拼凑到一起”来做出最终的决断的呢?

想象一下某个时刻,你不再是一个人类,而是一台电脑。快点!试想一下你会如何回答这个问题:“这是炸鸡还是小狗?”

你也许注意到了图片中的小狗有一些特性,而炸鸡有另外一些特性。

在下文中,我将介绍最大熵(MaxEnt)分类器。

定义

这里是维基百科对于最大熵(或者简称为 MaxEnt )的定义。

“最大熵分类器是一个对于多分类(例如,分类结果超过了两种情况)逻辑回归分类问题的泛化分类方法。”

“[Maximum entropy classification] is a classification method that generalizes logistic regression to multiclass problems, i.e. with more than two possible discrete outcomes.”

这是一个极佳的正式定义,但是我能想象,如果在我对 MaxEnt 一无所知的情况下读到这个定义,我也许会困惑不解。所以这里给出一个更通俗的解释,或许能给你一些启示。

如果我们被要求根据一些给出的数据(比如一幅图片)做出决断(比如,“这是一张小狗的图片还是炸鸡的图片”),我们会想到该数据的一些属性(比如,“图片里有没有一些像皮带一样的东西?”, “有没有2个像眼睛一样的小黑点?”)。

或许是为了显得高大上一点,聪明人喜欢把这些属性成为“特征”(feature)。其中的一些特征要比另一些更加重要。

“最大熵分类器”也是给一个特定方程式取得高大上的名字(那些愚蠢的聪明人啊!),我们将这些“特征”扔进这个数学方程,然后使用这个方程来告诉我们是否应该做出决断。对于数据中发现的每一个特征(比如,“有一个皮带”, “有两个像眼睛的黑点”,等),需要给它们加上一个权值,然后将所有的特征加在一起。最终,加权后的总和是正规化到0与1之间的一个小数。我们可以用这个小数来得到做出一种决断(比如,“这是一个小狗吗?”)的自信程度的“分数”。

“好了博主,炸鸡和小狗你已经说的够多的了。我想看一个NLP的例子!” 没问题,我想象出来的读者!但是在举例子之前,我们还要再深入的了解下背后的数学知识。

举个例子

想象一下,现在是1999年,你是一个电子邮件创业公司的第一批员工。你被要求阅读几封邮件,你的工作是判断该邮件是否是垃圾邮件。

邮件#1:

From:LeChuck@yahoo.com

哈哈!

请允许莪介绍一下我自己,我名字叫Lechuck,我从互联网邮件目录里找到了你的邮件地址。我在目录里点兵点将点到了你的名字。

根据你的名字判断,你猫似是个好人,所以我特此给你写了这份电子邮件。

我住在一个很遥远的岛上,而且我手上有笔钱(具体说,有12.2万美元)需要汇到海外去。你能帮莪个帮,帮我把这些钱转出去吗?

1) 提供给莪一个能让我把钱转进去的银行账号。

2) 发给我一张你的照片,这样当我到美国之后,我就知道去向谁道谢。点击下面的链接到我的Facebook

[www.lechuck.myfacebook.com/fake.link/give_me_money],

然后在里面发一张你的照片。

猴子 香蕉 金钱 富有 (Monkey bananas money rich)

作为报答,我愿意在钱成功的转入你指定的海外账户后,抽出15%作为你精力投入的补偿。

欢迎随时通过邮件地址lechuck@yahoo.com联系我。

邮件#2:

From:GuybrushThreepwood@gmail.com

你好Nade,

我是詹姆斯洛根高中的Guybrush。好久不见啊,你最近过的怎么样啊?

我听Elaine说,你马上要来混乱岛了(译者注:系列游戏“猴岛小英雄”中的一个小岛),所以我想看下你是不是想聚一聚。周五(9月8号)有空出来吃个晚饭吗?

我们可以像以前一样出来玩一玩,叙叙旧。我知道有个酒吧有超难喝的格罗格酒。

聚不聚都给我说一下!如果聚不成也没关系;我祝你旅途愉快!

再见,

Guybrush

很简单,对吧?好的,那怎么才能让电脑分辨出来呢?

让我从确定一些有用的特征开始吧。这是其中一些特征的小列表:

  1. f1(email): 邮件包含了拼写/语法错误

  2. f2(email): 邮件包含了汇款请求

  3. f3(email): 邮件内容中提及了邮箱主人姓名

我们假设其中一些特征要比其他的特征重要。让我们给每个特征一个权值,用于标识一封邮件是垃圾邮件:

  1. w1(spam) (邮件包含了拼写/语法错误): 0.5。 讲真的,你可以去校对一下你的邮件。

  2. w2(spam) (邮件包含了汇款请求): 0.2。 很多垃圾邮件都牵涉到银行汇款。

  3. w3(spam) (邮件内容中提及了邮箱主人姓名): -0.5。 如果邮件发送者提及了我

    的名字,那么这有可能就不是一封垃圾邮件。顺便说一句,请注意,对于做决断来说,权值可以为负数。

以下的特征权重用于标识邮件不是垃圾邮件:

  1. w1(not spam) (邮件包含了拼写/语法错误): -0.2

  2. w2(not spam) (邮件包含了汇款请求): 0

  3. w3(not spam) (邮件内容中提及了邮箱主人姓名): 1

(以上的权值的选择比较武断,仅用于讨论需要。我也许会在另一片博客中解释权值是如何使用训练数据习得的。

现在,你些许可以通过查阅梯度下降算法来满足你的好奇心。

也有一些其它更加高大上的算法在更加实际的情况下使用,特别是 L-BFGS 算法。

同时,吴恩达也有一个了不起的Courera 机器的学习课程,在课程中,他通过出色的视频课件讨论了梯度下降算法;这里是其中的一些视频。)

好了,现在我们有了特征,有了权值。我们已经做好了深入数学知识的准备了。

以下数学方程中最可怕的部分可能是牵扯了指数函数,但除此之外就都是些乘法,加法,除法,好了,让我们开始深入下去吧!

数学知识

设特征函数为 fi(x),它接受一个输入,x,并且返回结果为0或者1,这取决于特征是否存在于输入值 x 中:

进一步讲,对于 N 个特征,每个特征函数 fi(x) 关联着一个权值 wi(d),这个数标志着特征函数 fi(x) 相比于其他特征值在进行决断时有多重要,d(在当前例子中表示,“是垃圾邮件”或者“不是垃圾邮件”)。

我们可以通过一下流程来对于一个决断 d 在输入 x 上的分数进行“建模”(以我的看法,这个词可以被理解为“估算”):

  1. 对于特征中的每个特征函数 fi(x), 确定 fi(x) 的值为1还是0

  2. 将每个特征函数 fi(x) 与其相关的权值 wi(d) 相乘,其中权值的大小是根据被估算的决断d来决定的。

  3. 将所有的 权值特征的乘积相加 sumd = \sum_{i=1}^{N} w_i(d)f_i(x)

  4. 将总和丢进一个指数函数中: numeratord = exp(d)

  5. 将总和除以一个0到1之间的数,如此所有决断的分数和为1。事实证明,这是所有可能的决断 d 的分子的总和:denominator = \sum{d} \sum{i=1}^{N} w_i(d)*f_i(x)

以上过程基本相等以下方程:

让我们来想一想,如何每封邮件是如何评分的。

那么为了参考,让我们再看一下这两封邮件。

邮件#1:

From:LeChuck@yahoo.com

哈哈!

请允许莪介绍一下我自己,我名字叫Lechuck,我从互联网邮件目录里找到了你的邮件地址。我在目录里点兵点将点到了你的名字。

根据你的名字判断,你猫似是个好人,所以我特此给你写了这份电子邮件。

我住在一个很遥远的岛上,而且我手上有笔钱(具体说,有12.2万美元)需要汇到海外去。你能帮莪个帮,帮我把这些钱转出去吗?

1) 提供给莪一个能让我把钱转进去的银行账号。

2) 发给我一张你的照片,这样当我到美国之后,我就知道去向谁道谢。点击下面的链接到我的Facebook [www.lechuck.myfacebook.com/fake.link/giveme_money],

然后在里面发一张你的照片。

猴子 香蕉 钱 富有(Monkey bananas money rich)

作为报答,我愿意在钱成功的转入你指定的海外账户后,抽出15%作为你精力投入的补偿。

欢迎随时通过邮件地址lechuck@yahoo.com联系我。

检查特征的匹配程度如下:

f1:邮件包含有拼写、语法错误:是;

f2:邮件中含有汇款请求:是;

f3:邮件中包含发件人的名字:否。

因此,通过上述的特征描述,我们一定会将这封邮件归类为垃圾邮件,但是,让我们按照这个过程计算一下:

垃圾指数:

非垃圾指数:

LeChuck的邮件的垃圾指数(0.71)大于非垃圾指数(0.29),因此这是一封垃圾邮件。对于这样的结果我们一点儿也不感到吃惊,对不住了,LeChuck.

邮件#2:

下面是Guybrush的邮件,引文如下:

From:GuybrushThreepwood@gmail.com

你好Nade,

我詹姆斯洛根高中的Guybrush。好久不见啊,你最近过的怎么样啊?

我听Elaine说,尔马上要来混乱岛了(译者注:系列游戏“猴岛小英雄”中的一个小岛),所以我想看下你是不是想聚一聚。周五(9月8号)有孔出来吃个晚饭吗?

我们可以像以前一样出来玩一玩,叙叙旧。我知道有个酒吧有超难喝的格罗格酒。

聚不聚都给我说一下!如果聚不成也没关系;我祝你旅途愉快!

再见,

Guybrush

再一次检查特征的匹配程度如下:

f1:邮件包含有拼写、语法错误:是,” 媞”,”尔”,” 有孔”;

f2:邮件中含有汇款请求:否;

f3:邮件中包含发件人的名字:是。

由此看出Guybrush并不是一个好的email写作者,但是让我们看看我们的评估系统会不会将他的邮件分类为垃圾邮件。

垃圾指数:

非垃圾指数:

Guybrush的邮件垃圾指数(0.31)比非垃圾指数(0.69)少,因此该系统不会将Guybrush的邮件分类为垃圾邮件。看看起来我要去去跟他聚一聚,喝超赞的格罗格酒了。

添加更多的决策方式

那你可能已经注意到最大熵分类实际上支持多决策的问题。在这里,添加一个决策并不困难,但是将每一个步骤的细节都一一描述一遍只是会得到一个更长的公式,因此我将总结一下你将要做什么。

如果你要同时判断一封邮件是不是一封新闻邮件,比如:

From:info@ScummBar.com

嗨,朋友们

从9月10号到9月17号,Scumm酒吧所有的格罗格酒和其他超难喝的酒水饮料都享受五折优惠。点击这里【www.scummbar.fake.link.com】来看看所有的饮料和秋季特色食物。

到时见!

来自Scumm酒吧

为了添加这个决策,我们可能需要做如下的事情:

定义可以选出新闻邮件的一些特征——内容的类型(比如,包含图片、提到打折、邮箱地址是一个已知的商业机构等)。

对于每一个决策(垃圾邮件与非来及邮件,是否新闻邮件),如果有需要的话,重新定义特征的权重和偏差。

应用

最大熵分类是更经典的机器学习任务之一,并且可以解决自然语言处理之外的一些问题,一下是一些应用:

情感分析(例如,给定一个产品评价,分析评价者是不是喜欢该产品);

喜好分析(例如,给定一个人的统计资料,那么他会为哪个人投票呢?他会更喜欢超人、蝙蝠侠、还是忍者神龟呢?)

医疗诊断(例如,给定一些医疗图像、病史等特征,那么该病人处于怎样的身体状况呢?)

现实生活中的应用

以python为基础的自然语言处理工具包(NLTK)提供了最大熵分类的库文件。

其中的例程是根据一个大约8000个名字的名单,并且根据少量的基于字母的单个特征,来判断一个名字是男性还是女性。

调用该例程十分简单:

输出如下:

Training classifier…

==> Training (100 iterations)

Iteration … Log Likelihood … Accuracy

—————————————

1 … -0.69315 … 0.374

2 … -0.61426 … 0.626

3 … -0.59970 … 0.626

4 … -0.58597 … 0.627

5 … -0.57305 … 0.633

[…]

96 … -0.33073 … 0.809

97 … -0.33030 … 0.809

98 … -0.32989 … 0.809

99 … -0.32948 … 0.810

Final … -0.32908 … 0.810

Testing classifier…

Accuracy: 0.7980

Avg. log likelihood: -0.6085

Unseen Names P(Male) P(Female)

—————————————-

Octavius 0.9342 0.0658

Thomasina 0.0478 0.9522

Barnett 0.6464 0.3536

Angelina 0.0077 0.9923

Saunders *0.7839 0.2161

(如果想了解更多的话,这个例程恰好采用的是改进的尺度迭代算法来学习权重. NLTK的最大熵分类训练中也支持通用迭代算法、MEGA以及先进的生成模型工具包等。)

尽管我已经沉迷于该算法,但是我可能也不会说80%都能达到非凡的精确度。考虑到在该算法中,特征的设置是异常的简单的,这里罗列了一些用到的特征:

注意到以上的特征都是包含一个偏差项的,(也就是 “always on”),可以非常简单的检测一个名字中的首字母和最后的字母,以及该名字中所包含的子母。

结论

最大熵是基于你的数据中“特征”来帮助计算机产生决策的一个非常简单并且易于理解的工具。这些特征可能会由一定的权重影响后对产生最终的决策分数从而产生决策。最大熵也同时为逻辑回归和分类问题提供了一个很好的介绍,这一原理也经常用于解决一些实际中的问题。

最后,理解最大熵也为理解最大熵马尔科夫模型(MEMMs)和条件随机场(CRFs)打开了一扇大门。

相关推荐

Mac软件删除方法,这样删除不会有残留
Mac软件删除方法,这样删除不会有残留

Mac电脑如果有太多无用的应用程序,很有可能会拖垮Mac系统的运行速度。因此,卸载电脑中无用的软件是优化Mac系统运行速度的最佳方式之一。Mac卸载应用程序的方...

2023-09-23 17:34 xiyangw

安利一款 Mac 的清理工具 Cleaner One
安利一款 Mac 的清理工具 Cleaner One

自从入手mac以后,一直在找款mac的清理工具之前也尝试过CleanMyMac和柠檬清理柠檬清理是腾讯旗下的,虽然免费,但更新不频繁,最近一次更新还...

2023-09-23 17:33 xiyangw

苹果电脑需要安装杀毒软件吗?一文告诉你
苹果电脑需要安装杀毒软件吗?一文告诉你

随着数字时代的发展,计算机安全问题变得越来越重要。而在计算机安全领域中,杀毒软件是一个被广泛讨论的话题。苹果电脑需要安装杀毒软件吗?对于苹果电脑用户来说,他们常...

2023-09-23 17:30 xiyangw

mac上实用的工具

mac系统上有很多好用的工作,本期给大家带来一些本人长期使用的软件,特别是刚从windows系统的pc转移到macbook上的小伙伴,可能有一定的帮助。1.Alfred可以完全取代苹果自带Spotl...

Mac专用免费清理软件CleanMyMac
Mac专用免费清理软件CleanMyMac

在Mac中,越来越多的垃圾占用了磁盘空间怎么办?直接拖拽到废纸篓很多软件不能完全卸载干净怎么办……伴随着这些问题,如果有一款多功能的软件能够解决以上的全部难题就...

2023-09-23 17:29 xiyangw

MAC软件分享CleanMyMac中文版 支持最新版系统
MAC软件分享CleanMyMac中文版 支持最新版系统

CleanMyMac的强大不需要过多的去介绍,软件支持最新版Macos10.15.6系统。CleanMyMac具有非常强大的功能,可让您安全,智能地扫描和清理...

2023-09-23 17:28 xiyangw

安装CleanMyMac 3提示软件已损坏
安装CleanMyMac 3提示软件已损坏

安装CleanMyMac3提示软件已损坏,出现这样的原因是往往是使用了CleanMyMac3破解版,主要是因为CleanMyMac3的来源问题,我们的正版软件(...

2023-09-23 17:27 xiyangw

苹果Mac中使用 CleanMyMac X 清理垃圾时频繁要求输入密码如何解决?
苹果Mac中使用 CleanMyMac X 清理垃圾时频繁要求输入密码如何解决?

有不少用户反映在使用CleanMyMac清理系统垃圾文件的时候会频繁要求输入开机密码,如何解决这个问题?来看看吧!解决方法:1.打开「终端」,并输入以下命令...

2023-09-23 17:27 xiyangw

MacBook清理垃圾软件哪个好
MacBook清理垃圾软件哪个好

很多时候手动清理mac效果并没有那么好,常常会有疏忽的地方,其实我们完全可以依赖一些mac清理垃圾软件。windows上我们会借助360安全卫士、腾讯安全管家等...

2023-09-23 17:26 xiyangw

全球真的只有13台DNS根域名服务器吗?
全球真的只有13台DNS根域名服务器吗?

DNS根域名服务器(DNSrootnameservers)是一组特殊的DNS服务器,它们存储有关Internet域名系统(DNS)中所有顶级域的信息。这些...

2023-09-23 17:25 xiyangw

网络管理员,网络工程师每日一练

在DNS服务器中的()资源记录定义了区域的邮件服务器及其优先级。A.SOAB.NSC.PTRD.MX试题答案:D...

Android性能优化之网络优化DNS和HttpDNS知识详解
Android性能优化之网络优化DNS和HttpDNS知识详解

前言小计在App访问网络的时候,DNS解析是网络请求的第一步,默认我们使用运营商的LocalDNS服务。有数据统计,在这一块3G网络下,耗时在2...

2023-09-23 17:25 xiyangw

如何修改域名DNS服务器?修改DNS服务器常见问题汇总
如何修改域名DNS服务器?修改DNS服务器常见问题汇总

在域名管理过程中,我们为了获得更专业安全的域名解析服务,就需要修改DNS服务器,下面中科三方针对修改DNS服务器常见问题做下简单回答。1.修改DNS服务器和修改...

2023-09-23 17:24 xiyangw

netty系列之:在netty中使用 tls 协议请求 DNS 服务器

简介在前面的文章中我们讲过了如何在netty中构造客户端分别使用tcp和udp协议向DNS服务器请求消息。在请求的过程中并没有进行消息的加密,所以这种请求是不安全的。那么有同学会问了,就是请求解析一个...

「GCTT 出品」使用 Golang 构建 DNS 服务器
「GCTT 出品」使用 Golang 构建 DNS 服务器

需求:对DNS查询进行转发和缓存的本地DNS服务器。补充1:提供一个记录管理的接口(HTTPhandler)。补充2:提供一个名字(name)。D...

2023-09-23 17:23 xiyangw

取消回复欢迎 发表评论: