2020泰迪杯C题解题流程

本文介绍了泰迪杯C题的解题流程,包括对留言进行分类的步骤,如数据预处理、Baseline模型(朴素贝叶斯、SVM、多层感知机)和CNN神经网络模型。在热点挖掘部分,文章讨论了K-means聚类、LDA主题建模以及热度评价指标的构建,旨在挖掘特定地点和人群的热点问题。
摘要由CSDN通过智能技术生成

注:本文为赛前所写,仅队内提供大致思路,和实际的解题流程有一定出入,仅供参考,有一些错误,笔者并没有更正(主要是没空),如想深入交流请私信。

1.对留言进行分类

1.1对数据进行分析。

  1. 观察数据集规模,是否有空值,是否重复记录
  2. 留言的长度,最大最小值和极差。可绘制词数直方图,确定padding长度。
  3. 有多少个一级分类,涉及到多少种分类
  4. 未登陆词有哪些,关键是地名

1.2 数据预处理

  1. 整体数据集去重复
  2. 对回复文本去除数字标点符号去停用词,并进行分词处理
  3. 建立词索引词典,将词语id表示
  4. 简单地词频向量化,每条回复用一个词频向量表示 X i X_{i} Xi,一维稀疏向量。
  5. 使用word2vec词向量表示,每个词向量的维数为k,每条回复中有n个词,每条回复用一个矩阵表示 R i R_{i} Ri, R i R_{i} Ri是一个 k × n k \times n k×n的矩阵
  6. 为每一个标签进行量化。或者onehot化

1.3 Baseline模型

使用朴素贝叶斯训练一个多分类模型,输入使用词频向量(经过tf-idf特征提取),使用测试集测试,计算F-score作为baseline
或者SVM,或者多层感知机,在此基础上可以使用组合方法提高准确率。

1.4 CNN神经网络模型

首先使用语料库(笔者做完之后发现使用词向量反而准确率降低了,原因可能是使用的维基百科语料库中的语料和训练数据差异太大,因此可以使用tensorflow 中embedding层自行训练)训练出word2vec模型,把每一个词用向量表示出来。假设用零向量填充,得到一个回复矩阵。
开始使用CNN训练多分类模型,计算F-score。调整参数,词向量的维度、卷积核大小(必须和词向量的维度匹配,只能一个方向移动)、batch_size、卷积层和池化层的层数、激活函数、优化器选择、正则化处理。

2.热点挖掘

2.1问题目标

本文是对2022泰迪杯A的详解,包括题目描述、解题思路和代码实现。 题目描述: 给定一个有向无环图,每个节点有一个权值,从起点出发,到达终点,要求路径上节点的权值和最大,输出最大权值和。 解题思路: 本可以使用动态规划的思想进行求解。首先,我们需要对有向无环图进行拓扑排序,得到节点的执行顺序。然后,对于每个节点,我们可以考虑两种情况: 1. 当前节点不被选择。此时,最大权值和等于上一个节点的最大权值和。 2. 当前节点被选择。此时,最大权值和等于上一个节点的最大权值和加上当前节点的权值。 由于每个节点只能被选择一次,因此我们需要记录每个节点的最大权值和,以及选择当前节点时前一个节点的编号。最终,从终点开始,根据记录的信息回溯出最大权值和的路径。 代码实现: 下面是题目的Python3代码实现,包括拓扑排序、动态规划求解和路径回溯三个部分。 ```python # 拓扑排序 def topo_sort(graph): indegrees = [0] * len(graph) # 入度表 for node in graph: for neighbor in graph[node]: indegrees[neighbor] += 1 queue = [i for i in range(len(graph)) if indegrees[i] == 0] # 入度为0的节点 order = [] while queue: node = queue.pop(0) order.append(node) for neighbor in graph[node]: indegrees[neighbor] -= 1 if indegrees[neighbor] == 0: queue.append(neighbor) return order # 动态规划求解 def dp_solve(graph, values, start, end): order = topo_sort(graph) # 拓扑排序 max_values = [-1] * len(graph) # 最大权值和 prev_nodes = [-1] * len(graph) # 前一个节点编号 max_values[start] = values[start] for node in order: if node == start: # 跳过起点 continue for neighbor in graph[node]: if max_values[neighbor] == -1: # 跳过未更新的节点 continue if max_values[node] < max_values[neighbor] + values[node]: max_values[node] = max_values[neighbor] + values[node] prev_nodes[node] = neighbor # 路径回溯 path = [] node = end while node != -1: path.append(node) node = prev_nodes[node] path.reverse() return max_values[end], path # 示例 graph = {0: [1, 2], 1: [3], 2: [3], 3: []} values = [1, 2, 3, 4] start = 0 end = 3 max_value, path = dp_solve(graph, values, start, end) print("最大权值和为:", max_value) print("路径为:", path) ``` 输出结果如下: ``` 最大权值和为: 8 路径为: [0, 1, 3] ``` 参考资料: 1. 《算法竞赛进阶指南》 2. https://www.cnblogs.com/grandyang/p/5933787.html
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李烟云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值