文章类型分类项目

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

项目背景

在数据科学和机器学习的领域中,文本分析一直是一个引人注目的话题。这个项目的核心挑战是利用机器学习技术,根据文章或书籍的概要预测其类型。这不仅是一个技术挑战,涉及到复杂的文本处理和模式识别技术,而且还是一个应用挑战,探索如何在实际业务中利用这些技术。

数据集特征的详细介绍

  • 数据丰富性:项目的数据集包含了成千上万本书籍的概要,提供了一个多样化的文本数据集来进行机器学习实验。
  • 多维特征:除了基本信息如书名、作者和概要之外,数据集中还可能包括出版年份、ISBN、出版社、甚至书籍的物理尺寸等信息。这些特征提供了多维度的数据,有助于建立更准确的预测模型。
  • 类型多样性:数据集中的书籍被分为多种类型,从而提供了一个广阔的分类范围,这对于构建分类算法来说是非常有价值的。

应用领域的扩展

  • 出版业的革新:这个项目可以帮助出版商更精准地对书籍进行分类,从而优化其市场策略和读者定位。
  • 电子商务的提升:在线书店和电子书平台可以利用这些算法来提高推荐系统的准确性,从而提高用户体验和销售效率。
  • 学术研究的深化:对于从事文学研究的学者来说,这个项目提供了一种全新的文学作品分析方法,可以从数据科学的角度深入探索文本内容。

项目目标

  • 模型构建:这个项目的主要目标是构建一个有效的机器学习模型,能够准确预测书籍的类型。本项目采用逻辑回归,贝叶斯和支持向量机进行模型训练和测试。
  • 数据处理和特征工程:数据预处理是这个项目的关键部分,包括文本清洗、分词、向量化等步骤。此外,特征工程的目标是识别出哪些特征对于预测书籍类型最为重要。
  • 模型评估:评估模型的准确性、泛化能力和效率是项目的关键。这涉及到使用各种评估指标,如准确率、召回率和F1得分,以及交叉验证等技术。

项目的科学计算库依赖

  • matplotlib==3.7.1
  • pandas==2.0.2
  • scikit_learn==1.2.2
  • seaborn==0.13.0
  • sentence_transformers==2.2.2

项目的详细代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression 
from sklearn.svm import LinearSVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import cross_val_score

使用 pandas 读取训练数据集

data = pd.read_csv('data.csv')
print(data.columns)
data.shape
Index(['index', 'title', 'genre', 'summary'], dtype='object')
(4657, 4)
data.head()

data['genre'].value_counts().plot(kind='barh')

数据预处理

data['genre_id'] = data['genre'].factorize()[0]
data['genre_id'].value_counts()
5    1023
0     876
1     647
3     600
4     600
2     500
7     111
6     100
8     100
9     100
Name: genre_id, dtype: int64
data['summary'] = data['summary'].apply(lambda x: x.lower())
data.head()

from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-mpnet-base-v2')

def getEmbedding(sentence):
    return model.encode(sentence)

.gitattributes:   0%|          | 0.00/1.18k [00:00<?, ?B/s]
1_Pooling/config.json:   0%|          | 0.00/190 [00:00<?, ?B/s]
README.md:   0%|          | 0.00/10.6k [00:00<?, ?B/s]
config.json:   0%|          | 0.00/571 [00:00<?, ?B/s]
config_sentence_transformers.json:   0%|          | 0.00/116 [00:00<?, ?B/s]
data_config.json:   0%|          | 0.00/39.3k [00:00<?, ?B/s]
pytorch_model.bin:   0%|          | 0.00/438M [00:00<?, ?B/s]
sentence_bert_config.json:   0%|          | 0.00/53.0 [00:00<?, ?B/s]
special_tokens_map.json:   0%|          | 0.00/239 [00:00<?, ?B/s]
tokenizer.json:   0%|          | 0.00/466k [00:00<?, ?B/s]
tokenizer_config.json:   0%|          | 0.00/363 [00:00<?, ?B/s]
train_script.py:   0%|          | 0.00/13.1k [00:00<?, ?B/s]
vocab.txt:   0%|          | 0.00/232k [00:00<?, ?B/s]
modules.json:   0%|          | 0.00/349 [00:00<?, ?B/s]
embeddings = data['summary'].apply(lambda x: getEmbedding(x))
input_data = []
for item in embeddings:
    input_data.append(item.tolist())

使用 Tfidf 向量器与深度学习模型sentence embedding进行比较

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5,
                        ngram_range=(1, 2), 
                        stop_words='english')
# We transform each complaint into a vector
features = tfidf.fit_transform(data.summary).toarray()
labels = data.genre_id
print("Each of the %d synopsis is represented by %d features (TF-IDF score of unigrams and bigrams)"
Each of the 4657 synopsis is represented by 20152 features (TF-IDF score of unigrams and bigrams)

Tfidf 和sentence embedding模型之间的精度比较

使用 Tfidf 向量器的文本嵌入:

models = [
    RandomForestClassifier(n_estimators=100, max_depth=5, random_state=0),
    LinearSVC(),
    MultinomialNB(),
    LogisticRegression(random_state=0),
]
# 5 Cross-validation
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
    
    model_name = model.__class__.__name__
    accuracies = cross_val_score(model, features, labels, scoring='accuracy', cv=CV)
    for fold_idx, accuracy in enumerate(accuracies):
        entries.append((model_name, fold_idx, accuracy))
cv_df_tfidf = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])
cv_df_tfidf

使用sentence embedding模型的文本嵌入

models = [
    RandomForestClassifier(n_estimators=100, max_depth=5, random_state=0),
    LinearSVC(),
    LogisticRegression(random_state=0, max_iter=1000)
]
# 5 Cross-validation
CV = 5
cv_df = pd.DataFrame(index=range(CV * len(models)))
entries = []
for model in models:
    model_name = model.__class__.__name__
    accuracies = cross_val_score(model, input_data, data['genre'].factorize()[0], scoring='accuracy', cv=CV)
    for fold_idx, accuracy in enumerate(accuracies):
        entries.append((model_name, fold_idx, accuracy))
cv_df = pd.DataFrame(entries, columns=['model_name', 'fold_idx', 'accuracy'])

cv_df

注:从上面的比较中我们可以看出,当使用sentence embedding生成的文本嵌入时,所有模型的准确率都更高。因此,我们将使用这些嵌入词进行进一步的模型训练

此外,与其他模型相比,LinearSVC 的准确率最高。因此,让我们使用 LinearSVC 来训练我们的基因预测模型吧

模型训练

from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
X_train, X_test, y_train, y_test = train_test_split(input_data, 
                                                               labels, 
                                                               test_size=0.25, 
                                                               random_state=1)
model = LinearSVC()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# Classification report
print('\t\t\t\t\tCLASSIFICATIION METRICS\n')
print(classification_report(y_test, y_pred, 
                                    target_names= data['genre'].unique()))
					CLASSIFICATIION METRICS

              precision    recall  f1-score   support

     fantasy       0.77      0.77      0.77       233
     science       0.74      0.72      0.73       167
       crime       0.66      0.59      0.62       126
     history       0.76      0.77      0.76       145
      horror       0.66      0.59      0.62       132
    thriller       0.67      0.79      0.72       247
  psychology       0.79      0.76      0.78        25
     romance       0.63      0.34      0.44        35
      sports       0.86      0.83      0.85        30
      travel       0.89      1.00      0.94        25

    accuracy                           0.72      1165
   macro avg       0.74      0.72      0.72      1165
weighted avg       0.72      0.72      0.72      1165
genre_id_df = data[['genre', 'genre_id']].drop_duplicates()
conf_mat = confusion_matrix(y_test, y_pred)
fig, ax = plt.subplots(figsize=(8,8))
sns.heatmap(conf_mat, annot=True, cmap="Blues", fmt='d',
            xticklabels=genre_id_df.genre.values, 
            yticklabels=genre_id_df.genre.values)
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.title("CONFUSION MATRIX - LinearSVC\n", size=16);

保持embedding向量为文件

import pickle
with open('embeddings.pkl', 'wb') as file:
    pickle.dump(embeddings, file)
with open('embeddings.pkl', 'rb') as file:
    embeddings = pickle.load(file)

进行预测

from sentence_transformers import SentenceTransformer

# Initialize the SentenceTransformer model
model = SentenceTransformer('all-mpnet-base-v2')

def getEmbedding(sentence):
    # Generate and return the embedding for the provided sentence
    return model.encode(sentence)

# Example usage
test_summary = "Teenager Max McGrath (Ben Winchell) discovers that his body can generate the most powerful energy in the universe. Steel (Josh Brener) is a funny, slightly rebellious, techno-organic extraterrestrial who wants to utilize Max's skills. When the two meet, they combine together to become Max Steel, a superhero with unmatched strength on Earth. They soon learn to rely on each other when Max Steel must square off against an unstoppable enemy from another galaxy."
test_summary_embed = getEmbedding(test_summary)

 
X_train, X_test, y_train, y_test = train_test_split(input_data, data['genre'], 
                                                    test_size=0.25,
                                                    random_state = 0)
trained_model = LinearSVC().fit(X_train, y_train)
print(trained_model.predict([test_summary_embed]))
['science']

项目资源下载

详情请见文章类型分类项目-VenusAI (aideeplearning.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/465800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构.pta测试二

#include<iostream> using namespace std; typedef struct node {int data;node* next; }*List;List listPoduce() {int a;List L;node * r, * new0;//创建指针L new node();//分配空间r L;cin >> a;while (a ! -1){new0 new node();new0->data a;r->nex…

基于单片机的灭火机器人设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 灭火机器人系统工作原理 4 2 系统硬件设计 6 2.1 单片机 6 2.2 火焰探测系统设计 8 2.3 灭火系统设计 8 2.4 循迹模块设计 9 2.5 电机驱动模块 10 3 系统软件设计 12 3.1 系统软件开发环境 12 3.2 系统…

数据库事务中“锁”的分类

数据库事务中的锁可以按照不同的维度进行分类。以下是一些常见的分类方式&#xff1a; 1、按锁的粒度分类&#xff1a; 行锁&#xff08;Row-level lock&#xff09;&#xff1a;锁定单个或少量的数据行。这种锁粒度小&#xff0c;允许高度的并发&#xff0c;但管理开销大。页…

【每日一题】303. 区域和检索 - 数组不可变-2024.3.18

题目&#xff1a; 303. 区域和检索 - 数组不可变 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a;…

JS拖曳盒子案例

让我为大家带来一个小案例吧&#xff01; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box1 {width: 100px;height: 100px;background-color: black;margin-bot…

MyBatisPlus 之一:Spring 整合 MyBatisPlus 及雪花算法

1. Mybatis-Plus简介 Mybatis-Plus&#xff08;简称MP&#xff09;是一个 Mybatis 的增强工具&#xff0c;在 Mybatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。这是官方给的定义&#xff0c;关于mybatis-plus的更多介绍及特性&#xff0c;可以参考http…

力扣203. 移除链表元素

写法1、头节点 和 后面的节点 删除规则不一致 class Solution {public ListNode removeElements(ListNode head, int val) {//如果不建虚拟头节点&#xff0c;那删头节点和删后面的节点&#xff0c;逻辑是不一样的//头节点可能连续多个命中val,所以有while&#xff0c;不是ifwh…

Python从0到100(六):Python分支和循环结构的应用

分支和循环结构的重要性不言而喻&#xff0c;它是构造程序逻辑的基础。 一、程序的结构控制 单分支结构&#xff1a; 单分支结构是分支结构中最简单的一种方式&#xff0c;单分支结构只需要判断一个条件&#xff0c;根据这个条件是否成立来决定是否执行一段语句。 二分支结…

基于Spring Boot的煤矿信息管理系统

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对煤矿信息管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上…

亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具

3月16日&#xff0c;2024百度Create AI开发者大会正式开放售票&#xff0c;嘉宾套票定价399元。据悉&#xff0c;本次大会以“创造未来&#xff08;Create the Future&#xff09;”为主题&#xff0c;设有20深度论坛、超30节AI公开课、3000平AI互动体验区和AI音乐节等精彩环节…

【Linux】基础 IO(文件系统 inode 软硬链接)-- 详解

一、理解文件系统 1、前言 我们一直都在说打开的文件&#xff0c;磁盘中包含了上百万个文件&#xff0c;肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件&#xff0c;下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开&am…

每日五道java面试题之mybatis篇(四)

目录&#xff1a; 第一题. 映射器#{}和${}的区别第二题. 模糊查询like语句该怎么写?第三题. 在mapper中如何传递多个参数?第四题. Mybatis如何执行批量操作第五题 MyBatis框架适用场景 第一题. 映射器#{}和${}的区别 #{}是占位符&#xff0c;预编译处理&#xff1b;${}是拼接…

3.程序语言基础知识

主要议题&#xff1a; 掌握高级语言、低级语言的特点和应用场景&#xff1b; 程序编译&#xff0c;记词法、文法规则&#xff1b; 表达式主要考察中缀表达式和后缀表达式之间的相互转换&#xff1b; 传值与传址&#xff0c;分清特点&#xff0c;结合程序代码求值&#xff1b; …

python知识点总结(二)

这里写目录标题 1、什么是解释性语言&#xff0c;什么是编译性语言&#xff1f;2、说说中作用域是怎么划分的3、type和isinstance方法的区别4、浅拷贝和深拷贝5、python中变量在内存中存储方式6、python中的封装、继承、多态7、python中内存管理机制是怎么样的&#xff1f;8、简…

S32DS 中编译生成bin文件

1、按下图执行 按下图勾选 Create flash image 再次打开Properties 选择 Raw Binary 选择Debug_Flash进行编译后&#xff0c;在Debug_Flasg文件夹下就会出现bin文件 若没有出现 右键选择refresh 刷新一下即可

Python Web开发记录 Day13:Django part7 Ajax入门与案例(任务管理)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、Ajax入门①简介②工作原理③优点④缺点⑤使用…

明远创意生活引领经典家纺品牌“大朴”走向新生

十二年前,有一个初创的国产家纺品牌,大胆地向消费者喊出领先于行业的标准——“无甲醛、无荧光增白剂、无致癌物”。凭借这样极致的健康承诺,“大朴”国内销售规模迅速超过一亿人民币,成功引领行业风气,收获了众多忠实粉丝。 2023年,因资金链断裂,“大朴”原公司破产清算,这个…

图书管理系统

一.book包 1.书的类 一本书的基本内容&#xff1a; 成员变量是private那么我们就需要set和get方法&#xff0c;也需要一个构造方法&#xff1a; Tostring的方法也需要加上&#xff1a; 2.书的增加是i在书架上操作的&#xff0c;创建一个BookList类 首先我们需要让书和书…

nginx 基本使用、借助 nginx 和 mkcert 实现本地 https://localhost 测试。

CSDN 如何将资源设置为免费&#xff1f; 安装和基本使用 进入 nginx 官网 下载 Mainline version 版本 解压到一个你喜欢的位置&#xff0c;比如解压到 C: 目录 不管配不配置环境变量&#xff0c;对 nginx 的所有操作都应该在对应文件夹中 基本命令的使用&#xff1a; cd …

初级爬虫实战——哥伦比亚大学新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…