[nlp]意图分类是怎么实现的

  • 今天很开心,明天见! ->再见

到这里,我们模型需要的数据就有了。可以很清晰的写出下面的代码:


list_sen=['今天这个菜真好吃!','嗨!今天天气不错!','今天很开心,明天见!']

需要的数据就有了,下一步是提取特征。

特征提取


特征的提取是为了方便进行分类计算,每一个特征都具备一定的权重,表明它的权值。通过特征的权值,就能够确定句子属于哪一个类别。这里我们将每一个字作为一个特征,1/(字出现的总次数)作为权值。

首先构造一个字典,key为字,value为频率:


dict_voc=dict()

for s in list_sen:

    for w in s:

        if w in dict_voc.keys():

            dict_voc[w]+=1

        else:

            dict_voc[w]=1

输出为:


{'这': 1.0, '嗨': 1.0, '好': 1.0, '气': 1.0, '真': 1.0, '错': 1.0, '不': 1.0, '个': 1.0, '心': 1.0, '天': 0.2, '菜': 1.0, '今': 0.3333333333333333, ',': 1.0, '!': 0.25, '吃': 1.0, '明': 1.0, '见': 1.0, '很': 1.0, '开': 1.0}



到这里字典构造完毕,下一步就是构造类别的特征了。

前面说了,我们把每一个类别下的每一个字作为特征,代码也就可以写出来了。


features_one=dict()#吃饭  {字:频率}

features_two=dict()#打招呼

features_three=dict()#再见

for w in list_sen[0]:

    if w in features_one.keys():

        features_one[w]+=1

    else:

        features_one[w]=1

for w in list_sen[1]:

    if w in features_two.keys():

        features_two[w]+=1

    else:

        features_two[w]=1

for w in list_sen[2]:

    if w in features_three.keys():

        features_three[w]+=1

    else:

        features_three[w]=1

print(features_one)

print(features_two)

print(features_three)



#{'好': 1, '天': 1, '真': 1, '吃': 1, '!': 1, '菜': 1, '今': 1, '个': 1, '这': 1}

#{'不': 1, '!': 2, '气': 1, '嗨': 1, '错': 1, '今': 1, '天': 2}

#{'明': 1, '心': 1, '开': 1, '见': 1, ',': 1, '很': 1, '今': 1, '天': 2, '!': 1}



到这里特征的提取已经完成

模型准备


模型准备需要的是建立分类模型。这里我们通过给每一个特征赋予一个得分,然后将句子中每一个字的特征得分进行相加,然后就可以得到句子在某一个类别下特征的总得分,从而能够对句子进行分类。

比方说:今天的工作就到这里吧,大家早点回去,明天再继续吧。

这句话在每一个类别下的得分为:


特征命中:今、天、这、天

类别:吃饭

得分:4



特征命中:今、天、天

类别:打招呼

得分:3



特征命中:今、天、明、天、,、,

类别:再见

得分:6



这里,我们假设每一个字的权重为1,。显然,得分6最高,所属的类别应该是:再见。

到这里,我们所需要的模型就已经建立起来了。

训练模型


上一节有一个问题,比如今天在所有的类别都出现了,拜拜只出现在了再见类别,菜也只出现在了吃饭类别。这是不是意味这每一个特征应该具备不同的权重呢?或者说有些字的辨识度应该更高,有些字的辨识度应该更低呢?

是的,我们在这里通过1/(字出现的总次数)来对字的特征得分进行加权。


特征命中:今(0.3)、天(0.2)、这(1)、天(0.2)

类别:吃饭

得分:1.73



特征命中:今(0.3)、天(0.2)、天(0.2)

类别:打招呼

得分:1.13



特征命中:今(0.3)、天(0.2)、明(1.0)、天(0.2)、,(1.0)、,(1.0)

类别:再见

得分:4.13



结果还是属于类别再见。

有了前面的叙述,可以很方便的进行编码实现:


sen='今天的工作就到这里吧,大家早点回去,明天再继续吧。'

score1=0.0

score2=0.0

score3=0.0

print('class1:')

for w in sen:

    if w in features_one:

        print('word:',w,features_one[w],dict_voc[w])



![](https://img-blog.csdnimg.cn/img_convert/b046b79e42699681ece9a440b3a401af.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/1bbe4f7d0274b3481ab949b16ac3c0f6.png)


。'

score1=0.0

score2=0.0

score3=0.0

print('class1:')

for w in sen:

    if w in features_one:

        print('word:',w,features_one[w],dict_voc[w])



[外链图片转存中...(img-pUQ243q4-1720103354348)]

[外链图片转存中...(img-RSOa9Rux-1720103354348)]


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值