关于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}')
完整代码