人工智能(AI)和机器学习(ML)是密切相关但又有着明显区别的概念。人工智能旨在使机器或计算机表现出智能行为的能力,通常通过模拟人类的思维和行为方式来实现。与此不同,机器学习是使用算法和技术来训练机器或计算机,使其能够自动从数据中学习和改进自身的行为。
在构建一个新闻分类模型时,TensorFlow是一个常用的工具,用于开发和训练机器学习模型。TensorFlow是一个广泛使用的开源机器学习框架,可用于构建各种类型的模型,包括神经网络、决策树和深度学习模型等。通过使用TensorFlow,我们可以将收集到的新闻数据转化为一个预测模型,以协助自动识别新闻类别。
在构建新闻分类模型时,使用TensorFlow来开发和训练神经网络模型是非常常见的方法。神经网络模型类似于人类大脑的神经元,因此在进行新闻分类时,我们可以将新闻数据输入神经网络中,然后通过计算得到分类预测结果。
本文将介绍如何使用TensorFlow来训练一个新闻分类模型。我们将从数据准备开始,逐步构建模型,最后进行模型的训练和评估。
由于新闻分类太多了,我这里用证券和非证券两种形式来训练
pip install tensorflow
收集数据也要注意法律问题,不建议去使用爬虫爬取一些非法的数据。
# 第一部分:准备数据和环境
print("打开收集的新闻数据集")
# 打开一个存有数据的文件,里面是尽可能的去收集多一些的新闻数据
file = open("news.txt", "r", encoding="utf-8") # "r" 表示只读模式
# 读取整个文件内容
content = file.read()
数据预处理(Data preprocessing)的目的是为了使原始数据经过一系列的转换和处理后,能够更加方便地被存储、分析和应用。在机器学习和深度学习领域,数据预处理是非常重要的一环。
通常包括以下几个方面:
本次重在基础学习,就没有做那么多,就是做一个数据的分割
print("数据预处理")
labels = []
texts =[]
datas = content.split("\n")
for data in datas:
data = data.split("[fenge内容fenge]")
labels.append(data[0])
texts.append(data[1])
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
X = pad_sequences(sequences)
y = tf.keras.utils.to_categorical(labels)
Sequential()是Keras中的一个API,它用于创建一个神经网络模型,它将一个或多多个神经元连接到一起,然后将这些神经元连接到一起形成一个神经网络。Sequential()的API提供了多种不同的神经网络架构,包括简单的线性神经网络、多层感知器、自定义层等。
model = Sequential()
model.add(Embedding(input_dim=len(word_index) + 1, output_dim=100, input_length=X.shape[1]))
model.add(LSTM(128))
model.add(Dense(len(y[0]), activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(64)
val_dataset = tf.data.Dataset.from_tensor_slices((X_val, y_val)).batch(64)
epochs = 10
for epoch in range(epochs):
for batch_data, batch_labels in train_dataset:
history = model.train_on_batch(batch_data, batch_labels)
# 保存模型
model.save('my_news_classification_model_tf.h5')
val_loss, val_accuracy = model.evaluate(val_dataset)
print(f'Validation loss: {val_loss}, Validation accuracy: {val_accuracy}')
model.save('my_news_classification_model_tf.h5')
# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense
from sklearn.model_selection import train_test_split
# 第一部分:准备数据和环境
print("打开收集的新闻数据集")
# 打开一个存有数据的文件,里面是尽可能的去收集多一些的新闻数据
file = open("news.txt", "r", encoding="utf-8") # "r" 表示只读模式
# 读取整个文件内容
content = file.read()
print("数据预处理:文本清洗、标记化、分词等。")
labels = []
texts =[]
datas = content.split("\n")
for data in datas:
data = data.split("[fenge内容fenge]")
labels.append(data[0])
texts.append(data[1])
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
X = pad_sequences(sequences)
y = tf.keras.utils.to_categorical(labels)
print("构建模型")
model = Sequential()
model.add(Embedding(input_dim=len(word_index) + 1, output_dim=100, input_length=X.shape[1]))
model.add(LSTM(128))
model.add(Dense(len(y[0]), activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print("构建训练")
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(64)
val_dataset = tf.data.Dataset.from_tensor_slices((X_val, y_val)).batch(64)
epochs = 10
for epoch in range(epochs):
for batch_data, batch_labels in train_dataset:
history = model.train_on_batch(batch_data, batch_labels)
# 保存模型
model.save('my_news_classification_model_tf.h5')
print("模型评估")
val_loss, val_accuracy = model.evaluate(val_dataset)
print(f'Validation loss: {val_loss}, Validation accuracy: {val_accuracy}')
print("保存模型")
# 保存模型
model.save('news_classification_model_tf.h5')
如果遇到需要安装的包就安装就行了。
训练结束后我们使用一下
导入必要的库:
tensorflow
:用于创建和训练深度学习模型。load_model
:从磁盘加载已保存的Keras模型。Tokenizer
:用于将文本数据转化为序列化的工具。pad_sequences
:用于将不同长度的文本序列填充到相同的长度。加载预训练模型:使用load_model
函数加载事先训练好的文本分类模型(假设已保存为’news_classification_model_tf.h5’文件)。
创建 Tokenizer 对象:创建一个Tokenizer对象,用于将文本数据转化为序列化的格式,以便输入模型。
准备新闻文本数据:定义了一个新的文本数据 new_text
,这是您希望进行分类的文本。
对新文本进行预处理:首先,使用Tokenizer对象将新闻文本转化为整数序列(tokenization)。然后,使用pad_sequences
函数将序列填充为模型所需的固定长度。
进行分类预测:使用加载的模型对新文本数据进行分类预测。model.predict
返回一个概率分布,其中每个类别对应一个概率。
处理预测结果:在多类别分类问题中,通常会选择具有最高概率的类别作为预测类别。在这里,使用np.argmax
找到具有最高概率的类别的索引。
输出预测结果:打印出预测的类别编号。
import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
# 加载已保存的模型
model = load_model('news_classification_model_tf.h5')
# 创建 Tokenizer 对象并进行文本序列化
tokenizer = Tokenizer()
# 准备需要进行分类的新闻文本数据
new_text = "近日,摩根大通提高了对减肥药的销售额预期,预计到2030年,在诺和诺德和礼来制药的“双寡头”控制下,GLP-1受体激动剂相关药物的年销售额将超过1000亿美元。同时,摩根大通还预测,中国减重药物市场规模有望于2030年达到149亿美元。肥胖问题越来越受到人们的关注。根据《中国肥胖患病率及相关并发症:1580万成年人的横断面真实世界研究》报告指出,按照我国超重和肥胖的BMI分类标准,1580万成年受试者中超重人群占比34.8%,肥胖人群占比14.1%。假设按照目前中国14.2亿人口估算,约有4.94亿人超重,2亿人属于肥胖。而肥胖会引发高血压、高血脂等一系列疾病。国联证券表示,肥胖问题已经成为世界范围内的健康挑战,根据弗若斯特沙利文的统计数据显示,中国乃至全球的肥胖人数呈现持续增长的趋势。近年来全球减肥药市场规模年复合增长率达到10.7%,随着肥胖人数的增多以及居民的体重管理的意识的增强,减肥药市场潜在发展空间广阔。"
# 对新文本进行预处理,以使其与模型输入格式匹配
new_sequences = tokenizer.texts_to_sequences([new_text])
new_padded = pad_sequences(new_sequences, maxlen=len(new_sequences))
# 进行分类预测
predicted_probabilities = model.predict(new_padded)
# 对于多类别分类,您可能需要进一步处理输出
# 例如,取概率最高的类别作为预测类别
predicted_class = np.argmax(predicted_probabilities)
# 根据需要处理预测结果
print(f"预测类别编号:{predicted_class}")
**如果结果预测不准确,就需要扩大数据,训练更强的模型**