AI&爱の代码示例

发布于 2023-02-24  1284 次阅读


对聊天记录进行数据清洗

import re

# 读取聊天记录文件
with open('chat_records.txt', encoding='utf-8') as f:
    chat_records = f.read()

# 使用正则表达式提取聊天记录中的信息
records_list = re.findall(r'(\S+)\s+(\d{2}:\d{2}:\d{2})\n(.+)', chat_records)

# 将提取的信息整理为“发信人  时间  内容”的格式
for record in records_list:
    print(f"{record[0]}  {record[1]}  {record[2]}")

在这段代码中,首先我们使用open()函数读取了聊天记录文件,并使用正则表达式re.findall()函数提取了每个聊天记录中的发信人、时间和内容。然后,我们遍历了提取出来的信息列表,并使用print()函数将每条聊天记录整理为“发信人 时间 内容”的格式输出。

对消息进行情感分析

为了对每条信息进行情感分析,我们可以使用第三方Python库NLTK(Natural Language Toolkit)。首先,我们需要安装NLTK,可以使用以下命令:

!pip install nltk

接下来,我们需要下载一些NLTK数据集和模型,可以使用以下代码:

import nltk
nltk.download('vader_lexicon')

现在我们已经准备好使用NLTK进行情感分析了。以下是完整的代码:

import csv
import nltk
from nltk.sentiment import SentimentIntensityAnalyzer

nltk.download('vader_lexicon')

# 实例化情感分析器
sia = SentimentIntensityAnalyzer()

# 打开聊天记录文件并读取数据
with open('chat_history.csv', mode='r', encoding='utf-8') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        message = row[2] # 获取消息内容
        sentiment_scores = sia.polarity_scores(message) # 使用情感分析器获取情感分数
        sentiment = 'neutral'
        if sentiment_scores['compound'] > 0.05:
            sentiment = 'positive'
        elif sentiment_scores['compound'] < -0.05:
            sentiment = 'negative'
        print(row[0], row[1], row[2], sentiment) # 输出发信人、时间、内容和情感

以上代码使用NLTK的情感分析器对每条消息进行情感分析,并将情感分类为positive、negative或neutral。我们使用情感分数的复合值作为分类的基础,如果复合值大于0.05,则被视为positive,小于-0.05则被视为negative,否则为neutral。最后输出发信人、时间、内容和情感。

统计情感变化

为了统计两个人在聊天时的情感评分变化曲线,我们可以按照时间顺序对每条聊天记录进行情感分析,然后将情感评分作为y轴,时间作为x轴,绘制出两个人的情感评分变化曲线,比较两个人的情感走向。下面是示例代码:

import pandas as pd
import matplotlib.pyplot as plt
from textblob import TextBlob

# 读取聊天记录
df = pd.read_csv('chat_history.csv', names=['sender', 'time', 'content'], delimiter='\t')

# 按照时间排序
df.sort_values(by=['time'], inplace=True)

# 情感分析函数
def sentiment_analysis(text):
    blob = TextBlob(text)
    sentiment = blob.sentiment.polarity
    return sentiment

# 新增情感评分列
df['sentiment_score'] = df['content'].apply(sentiment_analysis)

# 按照发送人和时间分组,并计算每组的情感评分均值
grouped = df.groupby(['sender', 'time'])['sentiment_score'].mean().reset_index()

# 将横坐标转换为时间类型
grouped['time'] = pd.to_datetime(grouped['time'], format='%H:%M:%S')

# 绘制情感评分变化曲线
fig, ax = plt.subplots()
for sender in grouped['sender'].unique():
    data = grouped[grouped['sender'] == sender]
    ax.plot(data['time'], data['sentiment_score'], label=sender)
plt.legend()
plt.xlabel('Time')
plt.ylabel('Sentiment Score')
plt.show()

上述代码中,我们首先读取了聊天记录,并按照时间顺序对其进行排序。然后,我们定义了一个情感分析函数,使用TextBlob库进行情感分析,并返回情感评分。接着,我们新增了一个情感评分列,通过apply函数将情感评分应用到每一行聊天记录上。随后,我们按照发送人和时间对聊天记录进行分组,并计算每组的情感评分均值。最后,我们将横坐标转换为时间类型,并绘制情感评分变化曲线。

执行上述代码后,我们就可以获得两个人在聊天时的情感评分变化曲线,可以对比两个人的情感走向,从而更好地了解他们的交流情况。

建立语料库

建立语料库是一个基于机器学习和自然语言处理的复杂任务。以下是一个简单的方法,它可以用来建立一个简单的语料库并对既有的聊天记录进行辅助回复。

  1. 收集聊天记录并进行数据清洗。利用之前提到的代码,可以将聊天记录整理成“发信人,时间,内容”的格式,并将其存储到一个文本文件中。
  2. 对文本进行预处理。在这一步中,需要使用Python中的文本预处理库对文本进行清理、分词、去除停用词和标点符号等操作。这一步是为了将原始文本转换为可供机器学习算法使用的数字向量。
  3. 建立词袋模型。在这一步中,需要对预处理后的文本进行词袋编码,将每个文本转换为一个向量。在这个向量中,每个元素表示一个单词出现的次数。
  4. 训练机器学习模型。在这一步中,可以使用Python中的机器学习库(如scikit-learn)来训练模型。可以使用多种算法(如朴素贝叶斯分类器、支持向量机、决策树等)来训练模型。
  5. 应用模型进行辅助回复。一旦模型被训练,就可以使用它来对输入的文本进行分类。当一个新的输入文本被输入到模型中时,模型将自动对其进行分类,然后给出一个输出类别,即“积极”、“消极”或“中性”。利用这个输出,就可以对既有的聊天记录进行辅助回复。

以上是一个简单的方法,用于建立一个基于机器学习的语料库,并进行辅助回复。当然,要想获得更好的效果,需要对每个步骤进行更深入的研究和实验。

定时发消息的小工具

这里提供一种使用itchat库实现的方式。

首先需要安装itchat库,可以使用以下命令进行安装:

pip install itchat

然后可以使用以下代码实现每天定时给特定qq发送早安:

import itchat
import datetime
import time

def send_message():
    # 登录微信
    itchat.auto_login(hotReload=True)

    # 获取好友列表
    friends = itchat.get_friends(update=True)

    # 指定好友的昵称
    friend_name = "某某某"

    # 获取指定好友的username
    for friend in friends:
        if friend["NickName"] == friend_name:
            friend_username = friend["UserName"]
            break

    # 构造要发送的消息
    now = datetime.datetime.now()
    message = f"早安,今天是{now.year}年{now.month}月{now.day}日,{now.strftime('%A')}。"

    # 发送消息
    itchat.send(message, toUserName=friend_username)

    # 退出微信
    itchat.logout()

# 定时发送消息
while True:
    # 获取当前时间
    now = datetime.datetime.now()

    # 如果是早上9点,则发送消息
    if now.hour == 9 and now.minute == 0 and now.second == 0:
        send_message()
    # 等待1秒钟,继续检查时间
    time.sleep(1)

上述代码中,使用itchat.auto_login()方法登录微信,使用itchat.get_friends()方法获取好友列表,然后根据好友的昵称找到指定好友的username

然后使用datetime.datetime.now()获取当前时间,构造要发送的消息,最后使用itchat.send()方法发送消息。在循环中,每秒钟检查一次时间是否到达早上9点,如果到达则发送消息。

语音中的情感分析

要进行语音中的情感分析,我们需要先将语音信号转换为可分析的文本,然后再使用文本情感分析的技术进行分析。

这里我们可以使用Python中的SpeechRecognition库来进行语音识别,使用TextBlob库进行情感分析。

下面是一个简单的示例代码,需要安装SpeechRecognition和TextBlob库才能运行:

import speech_recognition as sr
from textblob import TextBlob

# 定义语音识别函数
def speech_recognition():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("请开始说话...")
        audio = r.listen(source)
    try:
        text = r.recognize_google(audio, language='zh-CN')  # 将语音转换为文本
        return text
    except:
        return "语音识别失败"

# 定义情感分析函数
def sentiment_analysis(text):
    blob = TextBlob(text)
    sentiment_score = blob.sentiment.polarity  # 获取情感分析得分
    if sentiment_score > 0:
        return "积极"
    elif sentiment_score < 0:
        return "消极"
    else:
        return "中性"

# 主程序
if __name__ == '__main__':
    text = speech_recognition()  # 进行语音识别
    print("识别结果:", text)
    sentiment = sentiment_analysis(text)  # 进行情感分析
    print("情感分析结果:", sentiment)

这个程序使用麦克风作为输入设备,等待用户说话,然后使用Google语音识别API将语音信号转换为文本,并使用TextBlob库对文本进行情感分析,最后输出情感分析结果。以下是一个简单的神经网络模型,用于对音频进行情感分析。该模型使用Mel-frequency cepstral coefficients (MFCCs)作为输入特征,并使用多层感知机(MLP)作为分类器。

import librosa
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import Adam

# 加载数据集和标签
X_train = np.load('X_train.npy')
y_train = np.load('y_train.npy')
X_test = np.load('X_test.npy')
y_test = np.load('y_test.npy')

# 提取 MFCC 特征
def extract_features(file_path):
    # 读取音频文件
    signal, sr = librosa.load(file_path, sr=22050)
    # 计算 MFCCs 特征
    mfccs = librosa.feature.mfcc(signal, sr=sr, n_mfcc=13)
    # 将特征转换为一个一维向量
    features = mfccs.ravel()
    return features

# 构建 MLP 模型
model = Sequential()
model.add(Dense(256, activation='relu', input_dim=X_train.shape[1]))
model.add(Dropout(0.3))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(1, activation='sigmoid'))

# 编译模型
optimizer = Adam(lr=0.0001)
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

# 训练模型
model.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test))

# 使用模型进行预测
def predict_emotion(file_path):
    features = extract_features(file_path)
    features = np.expand_dims(features, axis=0)
    prediction = model.predict(features)[0]
    return prediction

在上面的代码中,X_trainy_train 是用于训练模型的训练集数据和标签,X_testy_test 是用于测试模型的测试集数据和标签。 extract_features() 函数用于从音频文件中提取 MFCC 特征, predict_emotion() 函数用于使用训练好的神经网络对新的音频文件进行情感分析。

混合输入的情感分析

设计一个神经网络来处理同时输入音频、图片、文字的情感分析任务可以使用多模态深度学习模型,常用的模型包括 Multimodal Deep Learning Model、Multimodal Convolutional Neural Network(MCNN)、Multimodal Recurrent Neural Network(MRNN)等。以下是一个示例模型的架构:

  1. 图片模态
  • 卷积神经网络 (CNN) 提取图像特征。
  • 全连接层将图像特征映射到固定大小的向量。
  1. 音频模态
  • 使用语音识别技术将音频转换为 Mel 频谱图。
  • 用 CNN 提取 Mel 频谱图的特征。
  • 用全连接层将音频特征映射到固定大小的向量。
  1. 文本模态
  • 使用词嵌入将文本转换为向量。
  • 使用 RNN 或 Transformer 模型提取文本序列特征。
  • 使用全连接层将文本特征映射到固定大小的向量。

将三个模态的向量进行融合,可使用以下方式:

  • 串联(concatenation):将三个模态的特征向量沿着某个轴拼接在一起形成一个更长的向量,再通过一些全连接层进行分类。
  • 累加(sum):将三个模态的特征向量逐元素相加,并通过一些全连接层进行分类。
  • 带权相加(weighted sum):给每个模态的特征向量分配一个权重,然后将它们加权求和,再通过一些全连接层进行分类。

最后,我们可以使用交叉熵或均方误差等损失函数进行模型训练,使用梯度下降或其他优化算法进行参数更新,以实现情感分析任务。

由于任务涉及到数据集和具体的实现细节,无法直接给出完整的代码。不过我可以给您提供一个基本的框架,供您参考。

首先,您需要定义三个模态的输入。在本例中,我们假设音频输入是一段 10 秒钟的语音,采样率为 16000,图像输入是一个 224×224 的 RGB 图片,文本输入是一个长度为 128 的词向量。代码如下:

import torch

audio_input = torch.randn(1, 1, 16000*10)
image_input = torch.randn(1, 3, 224, 224)
text_input = torch.randn(1, 128)

接下来,您需要分别处理每个模态的输入。对于音频,您可以使用卷积神经网络(CNN)或长短时记忆网络(LSTM)来提取特征。对于图像,您可以使用预训练的卷积神经网络(如 ResNet 或 VGG)来提取特征。对于文本,您可以使用词嵌入层来将每个词转换为向量,并使用 RNN 或 Transformer 等模型来提取特征。下面是处理音频的代码:

import torch.nn as nn

class AudioFeatureExtractor(nn.Module):
    def __init__(self):
        super(AudioFeatureExtractor, self).__init__()
        self.conv1 = nn.Conv1d(1, 32, kernel_size=3, stride=1, padding=1)
        self.conv2 = nn.Conv1d(32, 64, kernel_size=3, stride=1, padding=1)
        self.pool = nn.AdaptiveMaxPool1d(output_size=128)

    def forward(self, x):
        x = self.conv1(x)
        x = nn.functional.relu(x)
        x = self.conv2(x)
        x = nn.functional.relu(x)
        x = self.pool(x)
        return x

audio_feature_extractor = AudioFeatureExtractor()
audio_features = audio_feature_extractor(audio_input)

这里我们定义了一个 AudioFeatureExtractor 类,它使用两个卷积层和一个自适应最大池化层来提取音频的特征。在 forward 方法中,我们首先对输入进行卷积和激活操作,然后进行池化,最后返回特征。您可以根据需要调整模型的结构和参数。

接下来,我们定义处理图像的代码:

import torchvision.models as models

class ImageFeatureExtractor(nn.Module):
    def __init__(self):
        super(ImageFeatureExtractor, self).__init__()
        self.model = models.resnet18(pretrained=True)
        self.features = nn.Sequential(*list(self.model.children())[:-1])

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, 1)
        return x

image_feature_extractor = ImageFeatureExtractor()
image_features = image_feature_extractor(image_input)

这里我们使用了预训练的 ResNet18 模型来提取图像的特征。在 forward 方法中,我们首先将图像输入 ResNet18 模型得到一个 512 维的特征向量,然后通过全连接层将其映射到 256 维。对于文本输入,我们使用了预训练的 GloVe 词向量模型,将每个单词转换为一个 300 维的向量表示,并使用 LSTM 层对序列进行建模,得到一个 256 维的文本特征向量。对于音频输入,我们使用了预训练的 VGGish 模型,将每个音频片段转换为一个 128 维的特征向量,然后通过全连接层将其映射到 256 维。

最后,我们将三个模态的特征向量拼接在一起,并通过全连接层进行情感分类。具体实现见下方代码。

        # 图像特征提取
        with torch.no_grad():
            image_feat = self.image_model(images)

        # 文本特征提取
        text_feat = self.text_model(text)

        # 合并三种特征
        combined_feat = torch.cat((audio_feat, image_feat, text_feat), dim=1)

        # 特征融合和分类
        out = self.classifier(self.fc(combined_feat))
        return out

以上代码首先使用预训练的 ResNet18 模型提取图像的特征,然后使用文本模型提取文本的特征,接着将音频、图像和文本的特征在第二个全连接层前进行合并,最后通过全连接层进行特征融合和情感分类。