抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

一方水土养一方人,抽象话养抽象机器人🤣

初探聊天机器人开发,实现学习群聊记录,进行群聊天😋

image-20230730180625124

🚧施工中,本页面还未完成(咕咕

🤖ChatBot的可行性

这是一个基于GPT-2模型的Chatbot,语料是经过清洗的我的某些群聊记录,下面是几则对话记录:

user:今天群友都在干嘛
chatbot:在学校卷
user:你是不是在卷
chatbot:我也在
user:你不许搞学术
chatbot:猫娘听不懂
user:你还猫娘是吧
chatbot:不知道,我还以为我是猫娘
user:你就一机器人
chatbot:我是什么臭鱼烂虾
user:你不是臭鱼烂虾
chatbot:这就去图书馆卷了
user:又卷?
chatbot:摆了一天了
==========================也会有语无伦次的部分=====================================
user:锐评一下原神
chatbot:原神怎么你了
user:你急了你急了
chatbot:你说的对,但是原神
user:这么喜欢原神?
chatbot:原神是一款自主研发的文明,在这里可以帮助你提出解决问题。游戏
user:说的什么意思
chatbot:原神我是认为,在一个喜欢的游戏时候。玩家都可以回答问题了,但
user:我是原批
chatbot:你这个是原友

(由于语料是聊天记录,所以对话效果不免有些抽象🤣)

如果搭配一些QQbot的框架,即可实现群内对话(图中群友已脱敏处理,“初一”即为对话机器人):

IMG_20230521_160416

🤖ChatBot的关键技术

1)海量文本知识表示:网络文本资源获取、机器学习方法、大规模语义计算和推理、知识表示体系、知识库构建;

2)问句解析:中文分词、词性标注、实体标注、概念类别标注、句法分析、语义分析、逻辑结构标注、指代消解、关联关系标注、问句分类(简单问句还是复杂问句、实体型还是段落型还是篇章级问题)、答案类别确定;

3)答案生成与过滤:候选答案抽取、关系推演(并列关系还是递进关系还是因果关系)、吻合程度判断、噪声过滤

🥬开胃小菜–基于情感词汇的中文情感计算

情感计算是一门备受关注的人工智能研究领域,其主要目标是赋予计算机情感能力。它涵盖两个核心方面:一是计算机的情感识别能力,即能够识别人类的情感;二是计算机的情感表达能力,即能够表达自身的情感。当前,国内外的情感计算研究主要集中在图像、声音、生理信号和文本等几个方面。

​ 迄今为止,心理学领域尚未达成普遍认可的情感分类标准。情感的分类方式多种多样,这主要源于人类情感的复杂性和多变性,以及人们对情感的认知尚未达到足够深入和全面的程度。而我们都知道的中国传统的“七情”大致分为:好,恶,乐,怒,哀,惧,欲。

​ 这里参考了一片论文[1]的中文情感分类,首先将情感分为7大类,这是在国外比较有影响的 Ekman的6大类情感的基础上划分的。因为6大类情感中的积极情感只有“高兴"一类,刻画得不够细致,然后又在"乐"的基础上增加了“好"—类来描述喜好、喜欢类型的情感。同时这7大类情感也基本上与中国传统的"七情"说法一致,只是少了“欲”一类。这是因为在目前的语义资源中描述"欲"类的情感词汇较少,所以没有单独划分出来作为一大类。

image-20230521170331063

​ 情感词汇本体通过一个三元组来描述:

Lexicon=(B,R,E)Lexicon = (B, R, E)

​ 其中,BB表示词汇的基本信息,主要包括编号、词条、对应英文、词性、录入者和版本信息。

RR代表词汇之间的同义关系,即表示该词汇与哪些词汇有同义的关系。

EE代表词汇的情感信息,是情感词汇描述框架中比较重要的一部分。

​ 情感强度的计算首先需要两类资源,一个是标准词,另一个是大规模的语料库。标准词就是为20类情感的5个情感等级分别确定的一定量的标准词汇。通过计算词汇与每个等级的标准词汇在语料中的互信息(即共现概率)来初步确定情感强度,然后再对不合理的进行人工调整。这里采用的是点互信息(pointwise mutual information),它的计算公式如下:

I(Wu,Sui)=log2P(WuSui)P(Wu)P(Sui)I(W_u,S_{ui})= \log_2\dfrac{P(W_uS_{ui})}{P(W_u)P(S_{ui})}

​ 其中,WuW_u表示包含uu类情感的词汇,SuiS_{ui}表示uu类情感的第ii个标准词。计算WW与所有uu类情感的标准词汇之间的互信息,选择互信息最大的那个标准词的强度作为词汇WWuu类情感上的强度。

​ 通过论文中的情感词汇本体库,我们可以编写Python程序对一段话,或者是一个语料库进行情感的计算和标注。

[1]先导入情感词汇本体的库文件

import pandas as pd

emo_path = r'D:\NLP-Project\emo_calc\data\emotion.xlsx'
emotion = pd.read_excel(path)
emotion = emotion[['词语', '词性种类', '词义数', '词义序号', '情感分类', '强度', '极性']]
emotion.head()

image-20230521175948221

[2]整理一下情感词语

Happy = []
Good = []
Surprise = []
Anger = []
Sad = []
Fear = []
Disgust = []
categories = {
    'PA': Happy,
    'PE': Happy,
    'PD': Good,
    'PH': Good,
    'PG': Good,
    'PB': Good,
    'PK': Good,
    'PC': Surprise,
    'NA': Anger,
    'NB': Sad,
    'NJ': Sad,
    'NH': Sad,
    'PF': Sad,
    'NI': Fear,
    'NC': Fear,
    'NG': Fear,
    'NE': Disgust,
    'ND': Disgust,
    'NN': Disgust,
    'NK': Disgust,
    'NL': Disgust
}

for idx, row in emotion.iterrows():
    category = row['情感分类']
    if category in categories:
        categories[category].append(row['词语'])

Positive = Happy + Good + Surprise
Negative = Anger + Sad + Fear + Disgust

[3]情感计算的主函数

from collections import Counter
from jieba import lcut

def emotion_calculate(text):
    emotions = {
        'positive': Positive,
        'negative': Negative,
        'anger': Anger,
        'disgust': Disgust,
        'fear': Fear,
        'sadness': Sad,
        'surprise': Surprise,
        'good': Good,
        'happy': Happy
    }

    wordlist = lcut(text)
    word_counts = Counter(wordlist)

    emotion_info = {'length': len(wordlist)}

    for emotion, wordset in emotions.items():
        frequency = sum(word_counts[word] for word in wordset if word in word_counts)
        emotion_info[emotion] = frequency

    indexs = ['length', 'positive', 'negative', 'anger', 'disgust', 'fear', 'sadness', 'surprise', 'good', 'happy']
    
    return pd.Series(emotion_info, index=indexs)

[4]进行文章的情感计算

(1)以《紫藤萝瀑布》为例,对其进行情感计算:

image-20230521202250709

image-20230521202719903

可以看出整体的情感是Positive占比大的

(2)以《在午夜,为你悲伤成河》为例,对其进行情感计算:

image-20230521204353342

image-20230521204624865

可以看出整体的情感是Negative占比大的

[5](拓展)对语料库进行批量的情感计算与标注

这里我以MongoDB储存的聊天记录为例,实现读取聊天记录文本,然后进行情感计算与标注,输出output.csv

(简化了部分预处理代码,且已做脱敏处理)

mongo.py

from pymongo import MongoClient
from pandarallel import pandarallel
import time

# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为100,默认为50
pd.set_option('max_colwidth', 100)

start = time.time()
# 创建连接
client = MongoClient('localhost', 27017)
db = client.YOUR_DB  # 连接数据库
collection = db.YOUR_COLLECTION  # 连接数据集合
prelist = list(collection.find())
msglist = [mesg['plain_text'] for mesg in prelist] #这里是聊天记录列表
message = pd.DataFrame(msglist, columns=['mesg'])
end = time.time()
print(end - start)

main.py


import pandas as pd
import time
import mongo
import emo_calc

# 并行计算
if __name__ == '__main__':
    WORKERS = 2    
    pandarallel.initialize(progress_bar=True, nb_workers=WORKERS)
    start = time.time()
    emotion_df = mongo.message['mesg'].parallel_apply(emo_calc.emotion_caculate)
    # emotion_df = mongo.message['mesg'].apply(emo_calc.emotion_caculate)
    print(type(mongo.message['mesg']))
    end = time.time()
    print(str(end - start)+'s')
    output_df = pd.concat([mongo.message, emotion_df], axis=1)
    output_df.to_csv('output.csv', index=False)
    print('success')

image-20230521205636665

[6]搭配QQbot的框架对群聊内容在线情感分析

image-20230521215638791

🥗小吃一口–基于Word2Vec的文本分析应用

当提到词嵌入或词向量时,大家会立刻联想到基于词向量进行词语拓展、文本向量化等应用。然而,实际上,词向量是一项与文本分析结合的工具或方法,可以开展许多有趣的工作。因此,本文的重点是从三个角度出发,即词嵌入的常规应用和八类用法、结合社会计算的常规词嵌入应用以及词嵌入对社会计算的概览。我们将介绍词向量(嵌入)在基本应用、技术特性以及人文社会计算领域中的使用场景,以供大家参考。(本篇参考论文:[2][3])

[1]Skip-gram网络结构

image-20230521212825712

[2]Word2Vec数据导入

本文所用数据为腾讯人工智能实验室提供的词向量数据,使用gensim进行快速调用

from gensim.models import KeyedVectors
import time

start = time.time()
wv_from_text = KeyedVectors.load_word2vec_format('TC_Model2.bin',binary=True)
print(time.time()-start)

[3]相似度计算

wv.similarity('国王','王后')
# 0.8485498 相似度高
wv.similarity('国王','王子')
# 0.81078386 相似度高
wv.similarity('钱','黑板')
# 0.19248267 相似度低
wv.similarity('沙子','土壤')
# 0.69350255 相似度适中

[4]近义词分析

wv.most_similar('国王',topn=6)
# [('帝国皇帝', 0.8872873783111572), ('君主', 0.8842490911483765), ('酋长', 0.8768572211265564), ('新国王', 0.8713781833648682), ('国王陛下', 0.8662869930267334), ('亲王', 0.8610170483589172)]

[5]找出不合群词

wv.doesnt_match(['喜悦', '悲伤', '愤怒', '吃饭'])
# 吃饭

[6]词向量加减

wv.most_similar(positive=['丈夫','老公'],negative=['妻子'])
# 老婆:0.913388	'丈夫'+'老公'-'妻子' = '老婆'

[7](拓展)搭配QQbot框架实现在线词向量加减

IMG_20230522_185228

🍚正餐–基于GPT-2模型的ChatBot


  1. 徐琳宏,林鸿飞,潘宇,任惠,陈建美.情感词汇本体的构造.情报学报,2008,27(2):180-185 ↩︎

  2. Quoc V. Le, Tomas Mikolov. Distributed Representations of Sentences and Documents ↩︎

  3. Tomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean. Efficient estimation of word representations in vector space ↩︎

评论