[DAY 20]用bot打出色色柴犬counter牌(更新句子相似度判断)

原本以为色色柴犬counter功能不会再更新了

直到discord上来了这样一段


哇他们这样玩还没触发counter让我很没面子你们知道ㄇ

之前的判断很简单就是有"可以色色"跟"不可以色色"的讯息出现才会打出counter牌

这次我直接用TF来得出句子相似度,函式参考这篇

完整代码如下,一样也是用cog架构

import pandas as pd
from discord.ext import commands
from core.classes import Cog_Extension
import discord
from random import choice
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
from scipy.linalg import norm
class main(Cog_Extension):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.table=[]
        self.nohokh = ["https://i.imgur.com/cZksr04.jpg","https://i.imgur.com/wH4CJLF.jpg","https://i.imgur.com/ag0DVMT.jpg"]
    
    def tf_similarity(self,s1, s2):
        def add_space(s):
            return ' '.join(list(s))

        # 将字中间加入空格
        s1, s2 = add_space(s1), add_space(s2)
        # 转化为TF矩阵
        cv = CountVectorizer(tokenizer=lambda s: s.split())
        corpus = [s1, s2]
        vectors = cv.fit_transform(corpus).toarray()
        # 计算TF系数
        return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))
    
    
    
    @commands.Cog.listener()
    #当有讯息时
    async def on_message(self,message):
        embed = discord.Embed()
        #排除自己的讯息,避免陷入无限循环
        if message.author == self.bot.user:
            return
        
        noh_sim = self.tf_similarity(message.content, "不可以色色")
        okh_sim = self.tf_similarity(message.content, "可以色色")
        
        #不可以色色排组对应图片
        if noh_sim > 0.7 and noh_sim > okh_sim:
            if "可以色色" and "不可以色色" in self.table:
                self.table=[]
                await message.reply(choice(self.nohokh))#特招
            else:
                noh = ["https://imgur.dcard.tw/TUGMyF7h.jpg","https://imgur.dcard.tw/ZayW5My.jpg","https://i.imgur.com/WLbQBlT.jpg","https://i.imgur.com/nGI4pbO.jpg","https://i.imgur.com/jrOvlgH.jpg","https://i.imgur.com/68mqoce.jpg"]
                self.table.append("不可以色色")
                await message.reply(choice(noh))#不可以色色康特
            # await message.channel.send(embed=embed)
        elif okh_sim > 0.7 and noh_sim < okh_sim:
            if "可以色色" and "不可以色色" in self.table:
                self.table=[]
                await message.reply(choice(self.nohokh))#特招
            else:
                okh = ["https://i.imgur.com/UVZti2m.jpg","https://i.imgur.com/FoGDvP7.jpg","https://i.imgur.com/c2pDzLJ.jpg","https://i.imgur.com/0Ux7atA.jpg","https://i.imgur.com/hnnSpzr.jpg","https://i.imgur.com/F03Raad.jpg"]
                self.table.append("可以色色")
                await message.reply(choice(okh))#可以色色康特
        


def setup(bot):
    bot.add_cog(main(bot))

呈现结果如下:

已经把程序码更新上去了,等着看好戏^^

至於频道上提到的透过关键字触发让某人去其他频道是可行的

看情况我会把这功能写出来


<<:  Day19 - 【概念篇】OAuth flows: Device Code(1)

>>:  [Java Day24] 6.1. 继承

Day17 动画介绍

概述 Vue提供了transition元件,在DOM中新增、删除、更改时提供了多种应用过渡效果,可以...

Day5 Data types, Variables, and Operators (Ⅰ)

Question:如果给定一个圆的半径是10,那麽圆面积是多少? Sol:首先第一个想法是,将10输...

以Postgresql为主,再聊聊资料库 利用自定义型态 create type 建立 typed table

先来看一张图 简单说明一下里面的指令: 先建立一个 table 名称鲑鱼寿司,里面有两个栏位,苹果跟...

Day10. 深入了解 Block - Block Part3

在Block系列文章里面 Day8 提到了Block, Proc Day9 提到了yield Day...