深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过,所以这里直接上代码

1、 数据部分

1.1 读取数据

# 加载数据
data_path = './data/news.csv'
data = pd.read_csv(data_path)

# 预览数据的前几行
data.head()

在这里插入图片描述
数据是csv格式,只有两列,第一列是标签(但是为中文),第二列是text,文本内容。

1.2 分词

import jieba

# 对数据进行分词处理
data['text_segmented'] = data['text'].apply(lambda x: ' '.join(jieba.cut(x)))

# 预览分词后的数据
data[['text', 'text_segmented']].head()

在这里插入图片描述
当然这里也可以加入停用词

1.3 构建词汇表

我们需要构建和处理文本数据的词汇表。词汇表是自然语言处理中的一个基本概念,它将文本中的单词映射到唯一的整数ID上。这样,文本数据就可以被转换为机器可以理解的数字格式。

class Vocabulary:
    def __init__(self, freq_threshold):
        # 初始化函数,freq_threshold是构建词汇表时单词出现的最小频次阈值。
        self.itos = {0: "<PAD>", 1: "<SOS>", 2: "<EOS>", 3: "<UNK>"}
        # 创建一个将整数ID映射到字符串(单词或特殊标记)的字典。
        # 这里包括了四个特殊标记:
        # "<PAD>":填充,用于将序列填充到相同长度。
        # "<SOS>":序列的开始。
        # "<EOS>":序列的结束。
        # "<UNK>":未知单词,用于处理词汇表中没有的单词。
        self.stoi = {v: k for k, v in self.itos.items()}
        # 创建一个将字符串映射到整数ID的字典。
        self.freq_threshold = freq_threshold
        # 将频率阈值设置为实例变量。

    def build_vocabulary(self, sentence_list):
        # 这个方法用于构建词汇表。
        frequencies = Counter()
        # 使用collections.Counter来计算每个单词的出现频率。
        idx = 4
        # 设置当前ID为4,因为前面已经为特殊标记预留了四个ID。

        for sentence in sentence_list:
            # 遍历句子列表。
            for word in sentence:
                # 遍历句子中的每个单词。
                frequencies[word] += 1
                # 增加单词的频率计数。
                if frequencies[word] == self.freq_threshold:
                    # 如果单词的频率达到了阈值。
                    self.stoi[word] = idx
                    # 将单词添加到stoi字典,赋予一个新的ID。
                    self.itos[idx] = word
                    # 将单词添加到itos字典。
                    idx += 1
                    # ID自增,为下一个单词预留位置。

    def numericalize(self, text):
        # 这个方法将文本转换为数字ID序列。
        return [self.stoi[token] if token in self.stoi else self.stoi["<UNK>"] for token in text]
        # 对于文本中的每个token(通常是单词):
        # 如果它在stoi字典中,就返回它的ID;
        # 如果不在,就返回UNK的ID。

创建好的词汇表如下

Vocabulary with 2966 words and special tokens: PAD, SOS, EOS, UNK. Words: , , , , , ,, 中, 国, 的, 澳, 大, 对, 不, 。, 民, 子, 珍, 妮, 父, 学, 女, 语, 和, 文, 华, 社, 会, 、, 化, 是, 在, 融, 入, 主, 流, 一, 他, 同, 人, 新, 利, 亚, 们, 母, 家, 教, 育, 要, 生, 说, 代, 以, 系, 关, 时, 快, 有, 发, :, 体, 1, 价, 9, 0, 所, 下, 这, 了, 常, 机, 为, 3, 5, 重, 三, 种, 者, 2, D, 还, 用, 英, 寸, 等, 4, 最, m, 感, 光, 像, 能, 值, 洋, T, H, 可, 7, ., 摄, 出, 6, 面, 识, 张, 其, 方, 持, 8, 【, 地, 】, /, V, c, 里, 近, 色, i, C, h, 也, 就, 嫂, 着, n, B, 带, 贝, 上, 味, e, M, a, t, 身, 性, r, , 与, 她, 并, o, k, 分, s, 裙, 高, S, u, 很, 如, 果, P, 实, d, 那, 到, 穿, 力, 个, w, 显, 现, 活, 更, 装, 且, 成, l, 言, J, 来, 本, 款, 得, 而, 越, 金, 数, 点, p, y, 包, 房, 之, 行, -, 头, 公, 回, 风, 海, 长, “, 天, ”, (, ), 元, 米, 景, 平, 湾, 居, 购, 外, 内, 游, 族, ★, 线, 看, 特, 山, 都, 过, 西, 水, 阳, 朔, 间, 桂, 林, 年, 多, 万, 量, 街, 心, 通, ?, 日, 南, 比, 岭, 当, 买, 候, 业, 网, 售, 格, 需, 修, 合, 开, 但, 记, 经, 象, 没, 销, 刘, 挺, 定, 式, 套, 少, 另, 支, 照, 进, 收, 税, 于, 受, 计, 问, 题, 示, 总, 屋, 应, 卖, 楼, 采, 此, 商, 按, 营, 相, 自, 费, 员, 部, 签, 我, 北, 导, 考, 加, A, 美, 世, 知, 度, 较, 好, 提, 立, 校, 参, 条, 难, 取, 才, 门, 备, 绩, 读, 全, 申, 请, 前, 供, 试, 单, 深, 士, 效, 法, 必, 须, 些, 步, 件, 表, 期, 拉, 让, 道, 月, 银, 司, 理, 任, 基, 师, 助, 产, 非, 适, 消, 称, 归, 信, 丹, 资, 管, 第, 事, 跟, 安, 托, 作, 赵, 认, 确, 将, 私, 引, 手, 只, 市, 品, 后, 募, 达, 位, 然, 清, 盘, 股, 至, 场, 担, 接, 报, 么, 息, 你, 情, 两, 访, 曾, 名, 投, 明, 德, 因, 素, 目, 赤, 去, 率, %, 指, 已, 今, 电, 建, 失, 气, 频, 强, 登, 石, 灾, 江, 超, 洪, 小, 四, 次, 降, 程, 雨, 湖, 毫, 暴, 区, 口, 亡, 直, 省, 害, 死, 该, 设, 均, 河, 务, 防, 动, 别, 汛, 具, 准, 极, 站, 范, 历, 围, 或, 再, 严, 续, 视, 测, 工, 台, 突, 保, 放, 损, 儿, 亿, 县, 双, 园, 疆, 各, 做, ;, 幼, 切, 统, 肯, 州, 据, 议, 研, 存, 旗, 正, 集, 团, 企, 专, 置, 普, 录, 土, 积, 份, 见, 王, 形, 随, 欲, 路, 块, 纪, 底, 拍, 号, 刷, 起, 住, 宅, 把, 标, 却, 仅, 论, 交, 贵, 渠, 使, 向, 预, 无, 拿, 源, 被, 钱, 获, 科, 东, 想, 及, 增, 副, 足, 半, 究, 额, 幅, 证, 周, 又, 势, 验, 边, 二, 般, 左, 右, 星, 变, 低, 送, 优, !, L, 屏, , 它, 功, 焦, 处, 质, 配, 抖, 评, 拥, 倍, 完, 限, 错, 话, 意, 委, 领, 展, 联, 千, 战, 界, 食, 际, 粮, 广, 济, 危, 影, 响, 复, 戴, 从, 调, 冲, 破, 障, 农, 断, 给, 推, 易, 环, 境, 减, 衡, 则, 争, 秉, 结, 洲, 解, 除, 努, 改, 域, 端, 促, 贸, 援, 护, 义, 项, 首, 扩, 落, 十, 惠, 共, 先, 己, 血, 造, 困, 划, 背, 技, 政, 物, 稳, 由, 术, 决, 组, 帮, 何, 治, 策, 丰, 八, 火, 求, 京, 密, 热, 负, 龙, 赛, 季, 早, 胜, 猛, 阵, 老, 维, 始, 警, 斯, 连, 险, 巨, 兵, 布, 望, 缺, 伤, 席, 输, 鹿, 括, 尼, 七, 板, 球, 差, 克, 尔, 约, 字, 兴, 友, 注, ×, R, G, F, 卡, 容, 片, Y, 移, v, W, 播, 温, 承, 五, 举, 峰, 欧, 巴, 罗, 旅, 尽, 许, 宝, 刚, 晤, 原, 终, 潮, 整, 盟, 益, 略, 坚, 继, 充, 挥, 伙, 伴, 协, 涉, 善, 制, 责, 朋, 微, 孩, 反, O, g, 告, 规, 每, 级, 临, 府, 升, 权, 几, 节, 春, 《, 》, 邦, 陈, 服, 满, 硬, 遭, 汉, 勇, 角, 演, 樊, 哙, 便, 算, 真, 诚, 致, 爱, 尚, 幕, 户, 施, 客, 顾, 亲, 卫, 浴, 富, 窖, 讯, 虽, I, 偏, 净, 截, 选, 占, 盛, 跌, 庆, 川, 博, 样, 择, 留, 什, 课, 习, 梦, 码, 笔, 观, 佳, 乐, 趣, 太, 打, 余, 债, 仍, 汇, 券, 健, 浦, 赢, 走, 未, 波, 搭, 绿, 久, 排, 伊, 依, 况, 涨, 封, 转, 书, 觉, 库, 属, 花, 纽, 夏, 洛, 讲, 顺, 云, 索, 型, 图, α, 速, 器, 操, 液, 晶, 创, 镜, 松, 精, 彩, 弹, E, 短, 票, 构, 离, 洁, 印, 希, 良, 互, 励, 模, N, 根, 列, 币, 逾, 初, 露, (, 村, ), 噪, 画, 载, 态, 百, 奴, —, 众, 喜, 轻, 庭, 压, 车, 红, 白, 欢, 甚, 紧, 免, 班, 休, 独, 养, 竞, 永, 赶, 愿, 群, 析, 传, 介, 木, 层, 触, 材, 局, 室, 疑, 念, 森, 乏, ", 类, 累, 键, 牌, 翻, 空, 迎, 扬, 裁, 碧, 溪, 命, 倒, 遍, 运, 远, 刻, 店, 令, 威, 黎, 惊, 城, 香, 圣, 驻, 史, 止, 浪, 箭, 马, 毕, 奥, 辛, 塔, 敦, 队, 钟, 盖, 帽, +, f, 敏, 圈, 细, 黑, 靠, 秒, 尘, 灰, 午, 嘉, 兰, 办, 段, 律, 座, 享, 佩, 亮, x, 编, 辑, 暑, 秀, [, ], 李, 朝, 否, 昨, 悉, 宜, 仓, 晋, 末, 透, 牛, 盈, 启, 圳, 贴, 福, 婚, 冰, /, 杰, 蛇, 妖, 狐, 衣, 戏, 执, 竹, 颜, 宋, 汶, 眼, 呈, 练, 待, 池, 架, 尺, 爆, 阿, 束, 即, 曼, 九, 换, 瑞, 岁, 脱, 鲁, 够, 旧, 暖, …, 借, 财, 湿, 坏, 绍, 例, 针, 订, 纳, 距, 田, 禁, 荣, 涯, 控, 堂, 榜, 军, 誉, 朗, 贡, 献, 篮, 哥, 击, 姆, 奇, 古, 枚, 音, 豪, 航, 听, 付, 娱, 储, 勒, 迷, 舞, 查, 霸, 冠, 典, U, 找, 招, 批, 守, 攻, 摆, 固, 乎, 哪, 凭, 遇, 脚, 脸, 拜, 核, 往, 膝, 纷, 夺, 病, 劲, 货, 闪, 锋, 凯, 抢, 判, 丁, 猫, 追, 剩, 韦, 扣, 斗, 詹, 犯, 侠, 罚, 迪, 康, 宁, 趋, 署, 陆, 籍, 咨, 询, 案, 偶, 镑, 港, 逐, 渐, 估, 急, 男, 嫁, 乔, 吃, 陪, 剧, 饰, 晚, 谈, 释, 泽, 梁, 淘, 狂, 智, 职, 酒, 郡, 喝, 状, 缴, 既, 雷, 杜, 吧, 霆, 词, 掘, 恐, 哈, 帕, 塞, 吉, 萨, 账, 补, 六, 简, 异, 竟, 奖, 呢, 届, 含, 址, 官, 培, 挑, 谢, 铁, 缩, 滑, 坡, 吸, 败, 措, ·, 翰, 逊, 监, 救, 玩, 剑, 砍, 匠, 铸, 折, 童, 魔, 怪, 皇, 写, 堪, 覆, X, 震, 避, 梅, 冷, 歌, 芳, 神, 静, 弱, 冬, 谐, 扮, 纯, 阶, 裤, 鞋, 唱, 玉, 洗, 绝, 概, 谁, 杀, 苦, 退, 宏, 润, 赞, 厂, 狗, 宣, 烦, 昂, 遗, 孙, 虑, 思, 激, 吴, 慧, 您, 雅, 途, 拟, 抗, 符, 聘, 检, 织, 医, 肝, 乙, 述, 怕, 携, 染, 杂, 毒, >, 阅, 拒, 映, 飞, 飘, 笑, 声, 齐, 坐, 偷, 刀, 柯, 皮, 故, 刺, 院, 尤, 诉, 馆, 筑, 烈, 丽, 坛, 潜, 础, 轨, 捷, 懒, 志, 繁, 诸, 顶, 乖, 猪, 络, 似, 探, 聊, |, 轮, 握, 料, 怎, 麻, 藏, 杭, 熟, 骗, 误, 掉, 黄, 延, 跨, 葛, 凤, 沙, 诺, 迁, 租, 呼, 停, 搬, 淹, 亩, 树, 枢, 宽, 干, 返, 柳, 闻, 耕, 镇, 吁, 召, 党, 跑, 央, 叫, 喊, ‘, ’, 巧, 逢, 宇, 档, 诀, Z, 津, 凡, 寻, 礼, 戈, 沃, 跳, 蚁, 薄, 晓, 廉, 饭, 附, 脑, 茶, 拼, 软, 柜, 薪, 娜, 摇, 序, 泰, 坦, 禅, 幸, 菲, 蒂, 辨, 迟, 雪, 旦, 假, 淡, 挂, 韩, 版, 毛, 暗, 衫, 肤, 尝, 青, 鲜, 瘦, 腰, 珠, 挡, 妨, 草, 舒, 杨, 审, 贷, 征, 混, 患, 督, 某, 添, 予, 答, 描, 恶, 岛, 武, 散, 踪, 妥, 赖, 殊, 抵, 苏, 倡, 遵, 章, 沟, 伯, 摩, 嫌, 讨, 歧, 吗, 媒, 彼, 晰, 烟, 枪, 狼, 胡, 狙, 剪, 恢, 扁, 饮, 辩, 灵, 诞, 哦, 野, 糕, 兽, b, 魅, 宠, Q, 箱, 艺, 秘, 妃, 厨, 郭, 毯, 帝, 唯, 帅, 侧, 斤, 肥, 仔, 漫, 秋, 妙, 荐, 抄, 贿, 赂, 迫, 乳, 曝, 谋, 射, :, 尊, 曰, !, 册, 雄, 莫, 伦, 辉, 沉, 颇, 轰, 驰, 敢, 碰, 婆, 赌, 伏, 恩, 贤, 忍, 蔚, 筹, 霞, 亦, 壳, 颁, 轴, 贺, 鸡, 侯, 浓, 怀, 饱, 隆, 冯, 仪, 著, 贯, 祝, 闭, 昌, 厌, 闲, 粉, 胸, 欣, 抱, 蓝, 董, 恒, 橱, 吊, 沈, 磨, 派, 俱, 杯, 泛, 厅, 郑, 拓, 畅, 瞬, 劳, 拖, 欠, 违, 油, 暂, 赎, 惜, 奈, 耐, 废, 抹, 宾, 昆, 床, 邀, 奢, 锦, 叶, 革, 涛, 俄, 砖, 琳, K, 菜, @, z, *, 烧, 熊, 孟, 舍, 忽, 扎, 夫, 霍, 授, 聪, 朱, 雇, 郊, 忘, 慢, 皆, 替, 跃, 旋, 夜, 浮, 萧, 泪, 燕, 横, 唐, 纵, 祖, 妈, 艾, 麦, 逃, 蔡, 徐, 训, 鸣, 彬, 爷, &, 袜, 驼, 髦, 粗, 曲, 腿, 苗, 溢, 稍, 迅, 综, 赴, 宗, 伟, 君, 径, 乘, 晨, 裔, 顿, 娘, 胖, 郎, 卧, 缘, 锁, 寒, 妇, 瓦, 宴, 掌, 厚, 邻, 墨, 契, 莉, 牵, 愈, 莱, 若, 隐, •, 肩, 圆, 纹, 庄, 妹, 辣, 塑, 聚, 摸, 谓, 伐, 丝, 恤, 巾, ?, 楚, 赏, 漂, 耳, 甲, 忆, 荡, 龄, 姿, 懂, 鸿, 桥, 蹈, 奋, 壁, 蓄, 锐, 迈, 埃, 涌, 惯, 欺, 虚, 陷, 忧, 糟, 萌, 搞, 披, 柏, 插, 囊, 奎, 蛋, 赚, 丑, 允, 彻, 幻, 骨, 恋, 纶, 镁, 夸, 琼, 鼓, 槛, 爽, 墙, 墅, 埋, 钢, 拆, 桌, 裂, 窗, 铺, 灯, 零, 炉, 洞, 炎, 靓, 玻, 璃, 膜, 撑, 钩, 槽, 柱, 躲, 袍, 敌, 疯, 赋, 兼, 艳, 涂, 阔, 敬, 庞, 劫, 俗, 氏, 筋, 罕, 恨, 旺, 旁, 姐, 苹, 辰, 甜, 扰, 宿, 偿, 爬, 袁, 骂, 弟, 察, 抓, 肋, 兑, 犹, 豫, 拨, 砸, 夹, _, j, 慎, 佛, 醒, 谨, 押, 猜, 兆, 姚, 凌, 亥, 仁, 详, 岗, 伪, 甩, 弘, 悬, 堡, 啊, 寓, 潘, 荷, 剔, 驱, 傻, 啦, 谷, 姓, 坠, 赔, 览, 滩, 棒, 徽, 峡, 甘, 芯, 雕, 耶, 挣, 搜, 邓, 仙, 怨, 贼, 冒, 默, 御, 腐, 艰, 振, 扶, 贫, 厦, 伸, 蛮, 痛, 祥, 氛, 链, 旨, 岸, 餐, 忌, 琪, 穷, 宙, 迹, 乱, 恰, 侵, 揭, □, 亏, 颈, 纤, 衬, 脖, 羊, 沿, 娇, 璇, 悲, 瓶, 窃, 缀, 妻, 喻, 叠, 仿, 辱, 蜂, 番, 尾, 汰, 药, 卓, 绕, 诱, 隔, 俏, 辫, 睛, 惑, 尹, 盲, 倾, ~, 蕾, 递, 鉴, 绮, 孤, 绎, 漠, 牙, 玄, 刊, 船, 绪, 莞, 拐, 骑, 牢, 蒙, 贾, 勾, 瓷, 弃, 泡, 腻, 疫, 蔓, 胁, 疗, 矿, 剂, 酬, 柔, 绒, 袖, 妆, 彰, 塌, 硕, 肆, 烂, 酷, 貌, 抛, 媚, 胆, 趁, 惨, 罪, 诈, 莲, 栋, 纠, 耀, 鱼, 乡, 斥, 械, 斌, 袋, 荒, 兄, 篇, 绵, 愉, 虎, 驾, 捕, 捉, 凶, 狠, 怖, 袭, 鼠, 乌, q, 纸, 帘, 渗, 侈, 胶, 卿, 炮, 颖, 桃, 勤, 吓, 渴, 臣, 芬, 乃, 弗, 眉, 刑, 羽, 循, 凸, 擦, 淀, 敞, 玲, 翠, 舰, 辅, 炼, 嫩, 卷, 框, 卢, 辞, 俩, 腊, 燃, 冻, 鬼, -, 穆, 涵, 坞, 症, 稿, 亨, 闹, 挤, 浩, 侨, 壮, 眷, 胞, 帜, 凝, 崇, 弊, 拘, 履, 赁, 滞, 盗, 秩, 井, 碎, 靴, 魂, 丧, 爪, 镖, 罢, 忙, 弄, 魏, 逼, 菊, 杉, 矶, 侦, 钮, 睐, 辈, 滴, 孔, 捧, 踏, 姬, 虞, 诗, 徘, 徊, 鹃, =, 吕, 俺, 翼, 哇, 俊, 呆, 傲, 飙, 缝, 彭, 屡, 臂, 鹰, 枫, 填, 邮, 阴, 仆, 厉, 呵, 撞, 堵, 函, 畔, 苑, 钥, 匙, 伍, 妞, 瞩, 慕, 炫, 〔, 〕, 棉, 芝, 怡, 骁, 搏, 句, 拳, 践, 碍, 牺, 牲, 戒, 奔, 茨, 缠, 削, 忠, 镶, 浅, 仕, 紫, 尴, 尬, 谦, 泥, 衔, 笼, 陶, 愧, 娃, 霖, 碌, 磋, 揽, 沂, 馈, 炯, 膏, 阻, 漆, 廊, 绘, 帷, 叹, 哭, 抽, 悄, 赠, 碑, 懈, 馨, 污, 煤, 吨, 缸, 疲, 喷, 莹, 钻, 铜, 镀, 淋, 洒, 泼, 悦, 逆, 憾, 弥, 慌, %, 攀, 渡, 迄, 斜, 抑, 娅, 吾, 杏, 砂, 锅, 炖, 糖, 耗, 姜, 汤, 蒜, 磁, 肘, 碗, 煲, 掀, 衷, 峻, 坤, 吹, 玛, 佐, 彦, 蛙, 诠, 爸, 裸, 奕, 邪, 炸, 残, 劣, 窝, 拯, 贪, 串, 崩, 溃, 耿, 旬, 篷, ;, 摊, 鹏, 巩, 诊, 肃, 谊, 谱, 慨, 髓, 舆, 页, 闷, 缓, 凉, 驭, 靡, 沪, 磊, 疼, 腾, 胀, 颠, 闯, 鼎, 遣, 棕, 遮, 肚, 臀, 堆, 扫, 稀, 寄, 刮, 虹, 撼, 麟, 尖, 棋, 犸, 扑, 桩, 挖, 惧, 丢, 爵, 裕, 羡, 圭, $, 瞻, 愁, 漏, 鲍, 绽, 嘴, 糊, 蜘, 蛛, 恭, 兹, 孕, 蒋, 罩, 凑, 拔, 滚, 绑, 耍, 顽, 囤, 顷, 沐, 嗜, 腕, 玫, 瑰, 踢, 竭, 坎, 嘘, 悍, 婴, 扔, 怒, 矩, 吼, 喀, 驶, 泉, 琴, 浙, 崔, 汪, 汽, 丈, 蜜, 朵, 煽, 贱, 鑫, 垫, 枕, 植, 祈, 昵, 蓬, 滕, 魄, 淑, 暨, 桑, 巡, 惹, 吻, 浑, 橄, 榄, 盐, 蔗, 氯, 哲, 朴, 盯, 衰, 碟, 匪, 攫, 蝉, +, 掩, 沦, 屈, 傅, 漓, 趸, 仇, 陌, 喧, 吵, 纲, 卦, 侃, 杆, 怜, 纱, 逛, 凹, 叛, 媛, 叉, 岩, 氧, 椅, 寿, 膨, 肉, 醛, 剥, 鼻, 愤, 冥, 扭, 辖, 颗, 遂, 钲, 磅, 蠢, 醉, 郁, 恼, 楠, 瓜, 宫, 睡, 撰, 浏, 咱, 叙, 廖, 奶, 爹, �, 徒, 逸, 灭, 堰, 吐, 谭, 僧, 盾, 凛, 矛, 锻, 脉, 妩, 钉, 弈, 奏, 勃, 筒, 锂, 哨, ⊙, 兔, 睹, 嵌, 仰, 萝, 垂, 裹, 茸, 饼, 狸, 狱, 虐, 摘, 鹅, 葬, 乾, 奉, 陵, 蝶, 俨, 湘, 闫, 惕, 沫, 役, 釜, 帆, 妍, 叔, 窦, 褶, 皱, 掷, 斩, 催, 仗, 慰, 聂, 舌, 曹, 庚, 肖, 译, 藤, 昊, 拦, 熬, 辽, 噱, 栏, 幽, 蔽, 帧, 徕, 枝, 垃, 圾, 鸟, 炭, 谅, 莎, 酿, 绣, 畴, 帐, 辆, 韵, 僵, 滤, 粘, 茅, 邹, 惟, 跷, 佬, 赫, 骄, 粹, 薇, 翁, 割, 焰, 悠, 谜, 澜, 凰, 媲, 羞, 茄, 屁, 蝙, 蝠, 揣, 擅, 姻, 侣, 滥, 遏, 遥, 嘛, 骆, 棣, 屑, °, 祭, 挚, 悚, 瘾, 拭, 铝, 厘, 擎, 湛, 扳, ~, 秦, 殿, 骚, 滔, 旭, 鹤, 闸, 酝, 洽, 矮, 荆, 寂, 浸, 梭, 娶, 呀, 暇, 勋, 炒, 闵, 柄, 狄, 睿, 纺, 豹, 祸, 喘, 黛, 昔, 邱, 煌, 啸, 撤, 挽, 匹, 萃, 廷, 圻, 坑, 敲, 臭, 幂, 炀, 掏, 帖, 灌, 汀, 荫, 稚, 鞍, 晒, 痒, 棍, 煮, 喂, 拾, 酵, 劝, 哗, 讶, 姨, 姑, 雾, 慈, 毅, 肌, 晃, 琢, 盆, 扯, 襟, 刃, 逄, 喉, 仑, 烁, 甫, 悟, 雯, 旱, 疾, 飓, 阱, 咖, 踩, 垮, 竣, 滋, 铅, 撒, 蹄, 畏, ', 沾, 熄, 阐, 燥, 锈, 寺, 巅, 熙, 铭, ., 艇, 屹, 幢, 吝, 讼, 靖, 沸, 佣, 崭, 盼, 凳, 萎, 锡, 愫, 撕, 溜, 蜀, 窄, 嬉, 戛, 犀, 筐, 翔, 攒, 溯, 岂, 脆, 挨, 杠, 竖, 骤, 蒸, 搁, 诵, 厕, 梳, 盒, 弛, 缕, 戟, 毁, 戚, 娟, 〈, 栩, 谍, 逻, 汗, 孝, 荧, 绳, 雀, 珊, 翎, 弧, 隙, 坊, 黯, 菱, 辟, 贩, 禧, 宰, 寇, 钓, 斑, 饶, 歇, 沛, 瞄, 俭, 炬, 卑, 婷, 橙, 琐, 缎, 渔, 夕, 呐, 豆, 钦, 揪, 颤, 谣, 勿, 毙, 桶, 唤, 痕, 脏, 倪, 仲, =, 删, 飚, 蹦, 庸, 悔, 尸, →, 彪, 羁, 泣, 矣, 昏, 瑟, 兢, 讽, 绚, 踊, 蚀, 灼, 塘, 滨, 挟, 缤, 渺, 璀, 璨, 芒, 熠, , 闳, 咕, 泵, 辐, #, 伺, 梯, 抚, 韧, 恳, 撩, 蹿, 捐, 誓, 鞠, 躬, 腹, 柴, 脾, 宪, 挫, 巷, 陋, 剖, ≤, 诡, 噬, 潇, 痴, 樱, 弯, 岳, 珑, 炙, 龚, 锣, 咀, 扛, 匾, 卸, 逝, 荼, 粤, 闽, 哄, 梨, 啡, 扇, 歪, 赘, 婉, 捂, 晕, 僻, 酌, 哼, 咬, 阎, 铎, 琦, 儒, 啬, 翘, 岐, 诏, 霉, 苯, 虫, 渣, 敷, 菌, 蜡, 绯, 寞, 傍, 濠, 萦, 沣, 茂, 拎, 泄, 瑜, 诟, 妤, 琅, 咸, 粒, 颓, ●, 娴, 狮, 倭, 煎, 绸, 铆, 耸, 彤, 汁, 宕, 绰, 渥, 橡, 栗, 烤, 膀, 驳, 捆, 镂, 蟹, 椰, 蓉, ­, 唇, 逗, 芸, 哎, 闺, 敝, 诛, 衙, 陀, 啥, 唉, 猴, 澡, 杖, 歉, 瞎, 嚣, 咋, ^, 絮, 熏, 暧, 昧, 佼, 肿, 睁, 肢, 芭, 骷, 髅, 弦, 炜, 焕, 弓, 灶, 寥, 挪, 阁, 瞪, 逮, 惩, 狭, 挠, 麾, 捞, 羹, 潢, 兜, 菩, 拱, 奠, 廓, 躁, 旷, 婧, 烘, 枉, 昭, 泳, 崛, 氓, 稻, 猎, 栽, 咏, 渝, 苛, 魁, 屉, 楷, 蝴, ¥, 镯, 橘, 搅, 轩, 衍, ∩, 捡, 悼, 殴, 匿, 摔, 鲲, 齿, 陕, 缅, 匆, 锏, 抬, 肺, 咳, 宛, 挎, 慷, 骏, 蜗, 邵, 淫, 窜, 缉, 乞, 锢, 哒

1.4 标签映射

我们之前看到标签是教育体育等文本,需要转换成数值标签

label_to_int = {label: index for index, label in enumerate(data['label'].unique())}
data['label'] = data['label'].map(label_to_int)

在这里插入图片描述

1.5 创建DataLoader

class NewsDataset(Dataset):
    def __init__(self, texts, labels, vocab):
        # 初始化函数,接收文本、标签和词汇表作为参数。
        self.texts = texts
        # 将文本数据存储为实例变量。
        self.labels = labels
        # 将标签数据存储为实例变量。
        self.vocab = vocab
        # 将词汇表存储为实例变量。

    def __len__(self):
        # 定义魔术方法 __len__,返回数据集中的样本数量。
        return len(self.texts)

    def __getitem__(self, index):
        # 定义魔术方法 __getitem__,用于通过索引获取数据集中的样本。
        text = self.texts.iloc[index]
        # 使用索引从文本数据中获取对应的文本。
        label = self.labels.iloc[index]
        # 使用索引从标签数据中获取对应的标签。

        numericalized_text = [self.vocab.stoi["<SOS>"]] + self.vocab.numericalize(text) + [self.vocab.stoi["<EOS>"]]
        # 将文本转换为数字ID序列,首先添加开始标记 "<SOS>",然后使用词汇表的 numericalize 方法将文本转换为数字ID,最后添加结束标记 "<EOS>"。

        return torch.tensor(numericalized_text), torch.tensor(label)
        # 返回一个元组,包含文本的数字ID序列(转换为 PyTorch 张量)和对应的标签(也转换为 PyTorch 张量)。


train_dataset = NewsDataset(train_texts, train_labels, vocab, max_length)
test_dataset = NewsDataset(test_texts, test_labels, vocab, max_length)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

代码中给出了详细的注释,所以就不过多的解释。

查看下数据
在这里插入图片描述

2、 创建模型

RNN模块

Pytorch中RNN模块函数为torch.nn.RNN(input_size,hidden_size,num_layers,batch_first),每个参数的含义如下:

  • input_size:输入数据的编码维度,比如房价预测,房价都是用一维的数直接表示的,所以此时input_size为1;如果输入的是字符编码,比如一个字符用3维编码表示,那么此时input_size为3;
  • hidden_size:隐含层的维数,这个维数要么参考别人的结构设置,要么自行设置,比如可以设置成20;
  • num_layers:隐含层的层数,也就是上面几幅图有几个h层,上面都是只有1层,所以 num_layers为1。
  • batch_first:当 batch_first设置为True时,输入的参数顺序变为:x:[batch, seq_len, input_size],h0:[batch, num_layers, hidden_size]。
class RNN(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim, n_layers, bidirectional, dropout):
        super().__init__()
        # 初始化函数,接收模型参数作为输入。
        # 调用父类 nn.Module 的 __init__ 方法。

        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        # 创建一个嵌入层,用于将单词的索引转换为密集的向量表示。

        self.rnn = nn.RNN(embedding_dim, hidden_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=dropout, batch_first=True)
        # 创建一个 LSTM 层,num_layers 指定层数,bidirectional 指定是否使用双向 LSTM,dropout 指定 dropout 比率,batch_first 指定输入数据的维度顺序。

        self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim)
        # 创建一个全连接层,如果使用双向 LSTM,则输入维度是 hidden_dim * 2,否则是 hidden_dim。输出维度是 output_dim,即分类任务的类别数。

        self.dropout = nn.Dropout(dropout)
        # 创建一个 dropout 层,用于防止过拟合。

    def forward(self, text):
        # 定义前向传播函数。
        embedded = self.dropout(self.embedding(text))
        # 将输入文本通过嵌入层和 dropout 层。

        output, hidden = self.rnn(embedded)
        # 将嵌入后的文本输入到 LSTM 层,output 是所有时间步的输出,hidden 是最后一个时间步的隐藏状态,cell 是最后一个时间步的细胞状态。

        if self.rnn.bidirectional:
            # 如果使用双向 LSTM,则将最后一个时间步的前向和后向隐藏状态拼接起来。
            hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim=1))
        else:
            # 如果使用单向 LSTM,则直接使用最后一个时间步的隐藏状态。
            hidden = self.dropout(hidden[-1,:,:])
        
        return self.fc(hidden)
        # 将处理后的隐藏状态输入到全连接层,并返回输出。

# 模型参数
vocab_size = len(vocab.stoi)
# 词汇表大小,即不同单词的数量。
embedding_dim = 100
# 嵌入层维度,即单词向量的维度。
hidden_dim = 256
# LSTM 层的隐藏状态维度。
output_dim = len(label_to_int)
# 输出维度,即分类任务的类别数。
n_layers = 2
# LSTM 层的层数。
bidirectional = True
# 是否使用双向 LSTM。
dropout = 0.5
# dropout 比率。

model = RNN(vocab_size, embedding_dim, hidden_dim, output_dim, n_layers, bidirectional, dropout)
# 创建 RNN 模型的实例。

模型结构

RNN(
  (embedding): Embedding(2970, 100)
  (rnn): RNN(100, 256, num_layers=2, batch_first=True, dropout=0.5, bidirectional=True)
  (fc): Linear(in_features=512, out_features=10, bias=True)
  (dropout): Dropout(p=0.5, inplace=False)
)

3、 开始训练

# 3. 训练模型
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
criterion = criterion.to(device)


from tqdm import tqdm
num_epochs = 10
for epoch in tqdm(range(num_epochs)):
    train_loss = train(model, train_loader, optimizer, criterion)
    valid_loss = evaluate(model, test_loader, criterion)
    print(f'Epoch: {epoch+1}, Train Loss: {train_loss:.4f}, Val. Loss: {valid_loss:.4f}')

在这里插入图片描述
完整代码

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

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

相关文章

基于springboot+vue的城镇保障性住房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)

大工程 从0到1 数据治理 之数据模型和设计篇 我这里还是sample database classicmodels为案列&#xff0c;可以下载&#xff0c;我看 网上还没有类似的 案列&#xff0c;那就 从 0-1开始吧&#xff01; 文章目录 大工程 从0到1 数据治理 之数据模型和设计篇什么是数据模型设计…

【Java程序设计】【C00321】基于Springboot的在线租房和招聘平台(有论文)

基于Springboot的在线租房和招聘平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线租房和招聘平台&#xff0c;本系统有管理员、用户、房东以及公司四种角色&#xff1b; 管理员&#xff1a;首页、个人中心…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

蓝桥杯_中断系统

一 中断 中断&#xff0c;即cpu暂停执行当前程序&#xff0c;转而执行另外一段特殊程序&#xff0c;处理结束后。返回之前暂停程序继续执行。 中断向量&#xff0c;中断服务程序的入口地址&#xff0c;每个中断源都对应一个固定的入口地址。 中断服务函数&#xff0c;内核响应中…

仿牛客网项目---用户注册登录功能的实现

从今天开始我们来写一个新项目&#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块&#xff1a;用户登录注册&#xff0c;帖子发布和热帖排行&#xff0c;点赞关注&#xff0c;发送私信&#xff0c;消息通知&#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…

重拾前端基础知识:HTML

重拾前端基础知识&#xff1a;HTML 前言HTML编辑器标签锚链接 id和class表单Iframe字符实体HTML CSSHTML JavaScriptHTML 统一资源定位器(Uniform Resource Locators)XHTMLHTML5新的语义化元素视频和音频支持Canvas绘图本地存储表单增强Web Workers地理定位Web存储伸缩矢量图形…

《TCP/IP详解 卷一》第10章 UDP和IP分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…

2024深度学习主流框架对比

tensorFlow 是最受欢迎和广泛使用的深度学习框架之一&#xff0c;目前在github的start数为181k。 TensorFlow是一个由Google Brain团队开发的开源深度学习框架。它允许开发者创建多种机器学习模型&#xff0c;包括卷积神经网络、循环神经网络和深度神经网络等&#xff0c;该框架…

全国产飞腾E2000Q +复旦微FPGA的轨道交通、电力解决方案

产品概述 ITX-XMF201是一款高性能边缘计算网关主板&#xff0c;采用飞腾E2000Q 4核处理器&#xff0c;国产化率达到95%国产化。 板载2电口&#xff0c;2路CAN&#xff0c;6路RS232接口&#xff0c;1路RS485接口&#xff0c;16路GPIO&#xff0c;可以满足银行、轨道交通、电力等…

【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧

在ArcGIS Pro二次开发中&#xff0c;SDK提供了一种工具界面【ArcGIS Pro ProWindow】。 关于ProWindow的用法&#xff0c;之前写过一篇基础的教程&#xff1a; 【ArcGIS Pro二次开发】(13)&#xff1a;ProWindow的用法_arcgispro二次开发教程-CSDN博客 主要是对几个常用控件…

Java开发的核心模式 - MVC

文章目录 1、MVC设计模式2、Web开发本质3、服务器的性能瓶颈 1、MVC设计模式 MVC设计模式示意图 在整个Java学习之旅中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;设计模式无疑占据着极其重要的地位&#xff0c;堪称理解和掌握Java项目开发精髓的钥匙。如…

【Python】Python实现串口通信(Python+Stm32)

&#x1f389;欢迎来到Python专栏~Python实现串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望…

3D数字孪生

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…

Spring 类型转换、数值绑定与验证(三)— Formatting 与 Validation

1 Formatting 在Spring中用于格式化数据及根据地域展示不同格式的数据。 图 Formatting接口 UML 1.1 注解驱动Formatting 自定义像“DateTimeFormat”注解来对相关字段格式化的步骤为&#xff1a; 自定义注解。定义一个实现AnnotationFormatterFactory接口的工厂类。往容器…

H3C OSPF Stub特殊区域+认证实验

H3C OSPF Stub特殊区域认证实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;所有路由器配置环回口 IP 地址为 X.X.X.X/32​ 作为 Router-id&#xff0c;X 为设备编号&#xff08;R5 除外&#xff09;按照图示分区域配置 OSPFR1 上配置默认路由&#xff0c;指…

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷&#xff1a; 2. 数据卷容器&#xff1a; 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直…

小白水平理解面试经典题目leetcode. 606 Construct String from Binary Tree【递归算法】

Leetcode 606. 从二叉树构造字符串 题目描述 例子 小白做题 坐在自习室正在准备刷题的小白看到这道题&#xff0c;想想自己那可是没少和白月光做题呢&#xff0c;也不知道小美刷题刷到哪里了&#xff0c;这题怎么还没来问我&#xff0c;难道是王谦谦去做题了&#xff1f; 这…

使用Java和PostGis的全国A级风景区数据入库实战

目录 前言 一、数据介绍 1、空间数据 2、属性表说明 3、QGIS数据预览 二、PostGIS空间数据库设计 1、空间表结构 三、Java空间入库 1、实体定义 2、数据操作Mapper 3、业务层实现 4、入库 5、数据入库验证 总结 前言 星垂平野阔&#xff0c;月涌大江流”“晴川历历…

.NET生成MongoDB中的主键ObjectId

前言 因为很多场景下我们需要在创建MongoDB数据的时候提前生成好主键为了返回或者通过主键查询创建的业务&#xff0c;像EF中我们可以生成Guid来&#xff0c;本来想着要不要实现一套MongoDB中ObjectId的&#xff0c;结果发现网上各种各样的实现都有&#xff0c;不过好在阅读C#…
最新文章