构建一个python金融舆情文本情绪打分的机器学习小项目

前言

构建一个Python金融文本情绪打分机器学习脚本模型的主要作用是分析金融相关文本数据,从中提取情绪信息,以帮助投资者、金融机构和分析师做出更明智的决策。这种脚本可以有以下作用:
1. 情绪分析:通过自然语言处理技术,识别文本中的情感,如积极、消极或中性情感,从而了解市场参与者的情感倾向。
2. 风险管理:帮助金融机构监测市场情绪,及时识别潜在风险,以采取适当的风险管理措施。
3. 投资决策:投资者可以利用情感分析来更好地理解市场情绪,从而做出更明智的投资决策,以降低风险或寻找投资机会。
4. 新闻事件分析:跟踪新闻报道和社交媒体上的金融新闻,以了解市场对事件的反应,预测市场走势。
5. 交易策略:为量化交易和算法交易提供情感数据,以制定更智能的交易策略。
构建这样的脚本通常需要自然语言处理库,情感分析模型以及金融数据源。通过分析文本情感,可以更好地理解市场参与者的情感倾向,从而在金融决策中提供有用的信息。

1.如何实现

1. 数据收集:获取金融相关文本数据,可以通过金融新闻网站、社交媒体、博客等渠道。
2. 数据预处理:对文本数据进行预处理,包括文本清洗、分词、去停用词等操作,对文本数据进行打分(数据标注),以准备数据供情感分析使用。

3. 情感分析模型:选择一个情感分析模型,如基于机器学习学习的情感分析模型,训练或加载预训练的模型。常见的选择包括线性回归、决策树等。

2.数据获取

数据获取本文这里以网络爬虫为例,网络爬虫来抓取金融相关文本数据。网络爬虫是一种自动化工具,可以访问网站并提取页面上的文本信息。以下是使用网络爬虫对新浪财经中的个股点评页面进行数据获取的,爬虫代码是如何实现这里不做过多讲解,此代码也可以自行改进以爬取其他内容:

这是新浪财经个股点评页面。

import requests
import re
import pandas as pd
import os
import jieba
import joblib
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
heaeds={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
# 假设起始URL为第一页
base_url = "https://finance.sina.com.cn/roll/index.d.html?cid=56588&page="
# 定义要爬取的总页数
total_pages = 25  # 例如,要爬取前25页的内容
for page_number in range(1, total_pages + 1):
    # 构建当前页的URL
    current_url = f"{base_url}{page_number}"
    res = requests.get(current_url,headers=heaeds).content.decode('utf-8')
    res.encode('utf-8')
    # print(res)
    biao_ti = '<li><a href=".*?>(.*?)</a>'

    biaoti = re.findall(biao_ti, res)

    # print(biaoti)

    bt = []
    for i in range(len(biaoti)):
        bt.append(biaoti[i])  

        bt[i] = bt[i].strip()

        # 打印
    # 使用zip函数将序列组合成一个数据列表
    # 创建一个DataFrame
    df = pd.DataFrame({ '新闻标题': bt})
    # 将DataFrame保存为CSV文件,用于后续操作,如果文件不存在,则创建一个新的文件,如果已存在,则追加到文件末尾
    df.to_csv('金融舆情数据.csv', mode='a', header=not os.path.exists('金融舆情数据.csv'), index=False)

以上爬取下来的数据我们用一个金融舆情数据.csv存储了起来,后面我们会用到。

3.数据处理

1.创建自定义的词性分数表

首先,需要创建一个包含金融词汇和它们的词性分数的表格或文件。在这个表中,为每个单词分配一个相关的分数,以表示该词对于情感的积极性或消极性。我们这里为金融积极词情感得分自定义在0.5~1之间,金融积极词分数自定义在0~0.5之间,中性词分配0.5。当然,博主已经为大家准备了博主准备好了的金融词性表,有需要的小伙伴可以评论区回复金融词性表,会私信给你。

2.文本情感打分

结巴分词:使用自然语言处理库(如NLTK或spaCy)对文本进行分词。我们这里采用结巴模块将文本拆分为单词或短语。
去停用词: 使用停用词列表来去除文本中的常见无关词汇,如“的”、“是”等。这有助于提取出重要的单词。
 词性分数打分:对每个分词后的单词,查找自定义的词性分数表以获取相应的分数。然后将这些分数累加起来,以平均求和获得文本的情感得分。这可以是一个简单的加权总和,也可以使用其他算法进行加权,例如逐句或段落。
 分数归一化:对得到的情感得分进行归一化,以确保它们在特定范围内(如0-1之间)。


# 读取金融舆情数据表
df_news = pd.read_csv('金融舆情数据.csv',encoding='gbk')
# 读取金融词性表
df_lexicon = pd.read_csv('金融词性表.csv',encoding='gbk')
finance_lexicon = dict(zip(df_lexicon['词汇'], df_lexicon['情感得分']))
def calculate_sentiment(title, lexicon):
    words = jieba.cut(title)
    word_list = list(words)
    print(word_list)
    sentiment_scores = [lexicon[word] for word in word_list if word in lexicon]
    print(sentiment_scores)
    # 如果没有匹配到词汇,将情感分数设置为默认值
    if sentiment_scores:
        return sum(sentiment_scores) / len(sentiment_scores)

    return 0.5 # 这里设置默认情感分数为0.5,可以根据需要调整


df_news['金融情感得分'] = df_news['新闻标题'].apply(lambda x: calculate_sentiment(x, finance_lexicon))
df_news.to_csv('金融舆情数据表_with_sentiment.csv', index=False)

以上代码将爬取的金融文本用词性表分别进行了打分,并导出文件金融舆情数据表_with_sentiment.csv。后面我们还会用到这个表作为模型训练集,结果如下:

4.情感分析模型构建

我们可以看到,用金融词性表给文本打分效果较好,但是劣势也是很明显:

1. 有限覆盖范围:词性表通常只覆盖了有限数量的词汇,可能无法捕捉新兴或特定领域的词汇。
2. 缺乏上下文考虑:词性表通常不考虑词汇在句子或文本中的上下文,可能无法处理复杂的情感表达。
3. 固定权重:词性表中的权重是固定的,不能根据文本或情境的不同动态调整。

相比之下,机器学习可以更好的解决这些问题:
1.上下文感知:** 机器学习模型可以考虑词汇在句子和文本中的上下文,从而更好地理解情感表达。
2. 更好的泛化能力:** 机器学习模型可以从训练数据中学到模式,具有更好的泛化能力,可以处理新词汇和不同领域的文本。
3. 自动学习特征:** 模型可以自动学习关键特征,无需手动定义权重。

下面用我们前面准备好的金融舆情数据表_with_sentiment.csv作为训练集,进行模型构建。

1. 数据读取:首先,读取数据表,确保它包含文本数据和与之对应的情感分数。需要将文本数据转化为机器学习可用的格式。通常,需要进行文本清洗、分词、去除停用词等操作。
2. 特征工程:*创建特征集合,这些特征将用于模型的训练。常见的文本特征包括词袋模型、TF-IDF特征、词嵌入(如Word2Vec或GloVe)等。可以考虑使用文本长度、标点符号的数量等其他特征来增强模型。我们这里选用Word2Vec
3. 划分数据集:*将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。
4. 选择机器学习算法:选择适合情感分析任务的机器学习算法。常见的选择包括朴素贝叶斯、支持向量机、随机森林、深度学习模型(如循环神经网络或卷积神经网络)等。我们这里使用线性回归和决策树两个算法
5. 模型训练:使用训练集对所选算法进行训练。模型将学习文本特征与情感分数之间的关系。
6. 模型评估:使用测试集来评估模型的性能。通常使用指标如均方误差(MSE)、均方根误差(RMSE)、相关系数等来度量模型的准确性。

以下为具体代码实现:

from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
import joblib
import jieba
from sklearn.model_selection import train_test_split
from nltk.tokenize import word_tokenize

df = pd.read_csv('金融舆情数据表_with_sentiment.csv')

# 分词
# 去除停用词
# 从文件加载中文停用词
with open('cn_stopwords.txt', 'r', encoding='utf-8') as file:
    cn_stopwords = set([line.strip() for line in file])

# 检查一下停用词是否加载成功
print(cn_stopwords)

# 示例数据框 df,假设有一列名为 '新闻标题' 需要处理
df['新闻标题'] = df['新闻标题'].apply(lambda x: [word.lower() for word in jieba.cut(x) if word.lower() not in cn_stopwords])


X_train, X_test, y_train, y_test = train_test_split(df['新闻标题'], df['金融情感得分'], test_size=0.2, random_state=42)

from gensim.models import Word2Vec

# 假设 X_train 是包含分词后的文本列表的列表
model = Word2Vec(X_train, vector_size=100, window=5, min_count=1, sg=0)  # 根据需要调整参数
# 示例:将每个文本的词向量进行平均以获取文本表示
def text_to_vector(text, model):
    vectors = [model.wv[word] for word in text if word in model.wv]
    if vectors:
        return sum(vectors) / len(vectors)
    else:
        return None  # 如果文本中的所有词汇都不在模型中,返回None或其他适当值

# 对每个样本应用文本到词向量的转换
X_train_word2vec = [text_to_vector(text, model) for text in X_train]
X_test_word2vec = [text_to_vector(text, model) for text in X_test]

#tfidf_vectorizer = TfidfVectorizer()
#X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
#X_test_tfidf = tfidf_vectorizer.transform(X_test)
#线性回归
model = LinearRegression()
model.fit(X_train_word2vec, y_train)
joblib.dump(model, 'your_model_filename.pkl')    #保存模型
#决策树
model2 = DecisionTreeRegressor(random_state=42)
model2.fit(X_train_word2vec, y_train)
joblib.dump(model2, 'your_model_filename2.pkl')    #保存模型
#线性回归
y_pred = model.predict(X_test_word2vec)
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
print(f'线性回归均方误差:{mse}')
print(f'线性回归平均绝对误差:{mae}')

#决策树
y_pred2 = model2.predict(X_test_word2vec)
mse2 = mean_squared_error(y_test, y_pred2)
mae2 = mean_absolute_error(y_test, y_pred2)
print(f'决策树均方误差:{mse2}')
print(f'决策树平均绝对误差:{mae2}')

脚本运行界面: 

模型评估结果如下:

看似两个模型性能不错,不过我们还需要对我们训练的模型进行进一步优化,确保模型在不断变化的环境中保持高性能和有效性

总结

本文以上构建一个金融文本情绪分析系统,可以对金融新闻、评论和文章等文本数据进行情感评估。这是一个可玩性的项目,以上功能可应用到金融市场分析的各个方面,因为金融市场受到情感和消息的影响,而情感分析可以帮助投资者更好地理解市场情绪和趋势,从而做出更明智的决策。更多的科普这里博主便不再做描述

看法和建议:
1. 数据的质量至关重要:确保金融文本数据具有高质量和准确性。不仅要获取数据,还需要清洗和预处理数据,以去除噪声和不准确信息。
2. 特征工程:考虑使用不同的特征工程技术,如词袋模型、TF-IDF、Word2Vec等,以将文本数据转化为适合机器学习模型的特征向量。
3. 选择情感分析模型:你可以尝试不同的情感分析模型,如基于词典的方法、机器学习模型(如线性回归、决策树、随机森林)或深度学习模型(如LSTM或BERT)。选择适合你数据和问题的模型。
4. 模型评估和优化:使用适当的评估指标来评估的模型性能,如均方误差(MSE)、平均绝对误差(MAE)等。不断优化模型以提高其性能。
5. 部署和实时应用:一旦的模型表现良好,考虑将其部署到实时应用中,以分析实时的金融文本数据。
6. 情感标签的可解释性:确保你的情感标签是可解释的,这对于投资者和决策者理解情感分析结果至关重要。
7. 数据安全和隐私:处理金融数据时,务必关注数据安全和隐私合规性。

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达板森家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值