应用爬山算法做文本数据的挖掘和分析

       爬山算法是一种启发式搜索算法,用于求解优化问题。它从一个初始解开始,逐步通过比较当前解与其邻域解的优劣来选择下一个可能更优的解,直到达到一个局部最优解或者无法进一步改进为止。爬山算法的核心思想是“贪心”,即每一步都选择能使目标函数值增加最多的方向前进。

基本原理

爬山算法从一个随机选定的点开始,然后在每一步中选择当前点的邻居中能最大化目标函数的点作为新的当前点。这个过程会一直持续,直到达到一个局部最大值,即周围的邻居都没有比当前点更好的解。

优缺点

  • 优点
    • 简单易实现:算法逻辑简单,容易编码实现。
    • 计算效率高:在合适的问题上能快速找到解。
  • 缺点
    • 容易陷入局部最优:由于算法本质上是贪心的,容易在复杂的搜索空间中陷入局部最优。
    • 对初始解敏感:算法的最终结果很大程度上取决于初始解的选取。

写一个爬山算法应用在文本数据的挖掘和分析,如关键词提取和信息检索的小例子。

package mainimport ("fmt""github.com/yanyiwu/gojieba""math""math/rand""sort""strings""time"
)// 文档集合
var documents = []string{"我爱北京天安门","北京天安门上太阳升","伟大领袖毛主席","指引我们向前进",
}// 预先分词并存储结果
var tokenizedDocs [][]stringfunc init() {seg := gojieba.NewJieba()tokenizedDocs = make([][]string, len(documents))for i, doc := range documents {tokenizedDocs[i] = seg.Cut(doc, true)}
}// 计算TF-IDF值
func calculateTFIDF(word string, docs [][]string) float64 {// 计算词频(TF)tf := float64(countOccurrences(word, docs)) / float64(len(docs))// 计算逆文档频率(IDF)idf := math.Log(float64(len(docs)) / float64(countDocumentsWithWord(word, docs)))// 计算TF-IDFreturn tf * idf
}// 统计单词在所有文档中出现的次数
func countOccurrences(word string, docs [][]string) int {count := 0for _, words := range docs {for _, w := range words {if w == word {count++}}}return count
}// 统计包含特定单词的文档数量
func countDocumentsWithWord(word string, docs [][]string) int {count := 0for _, words := range docs {for _, w := range words {if w == word {count++break}}}return count
}// 爬山算法
func hillClimbing(docs [][]string, maxIterations int) []string {// 获取所有唯一的单词uniqueWords := getUniqueWords(docs)// 随机选择一组初始关键词currentKeywords := getRandomKeywords(uniqueWords, 5)for i := 0; i < maxIterations; i++ {// 计算当前关键词集的TF-IDF总和currentScore := 0.0for _, keyword := range currentKeywords {currentScore += calculateTFIDF(keyword, docs)}// 尝试替换一个关键词for j := 0; j < len(currentKeywords); j++ {newKeywords := make([]string, len(currentKeywords))copy(newKeywords, currentKeywords)newKeywords[j] = uniqueWords[rand.Intn(len(uniqueWords))]// 计算新关键词集的TF-IDF总和newScore := 0.0for _, keyword := range newKeywords {newScore += calculateTFIDF(keyword, docs)}// 如果新关键词集更好,则更新当前关键词集if newScore > currentScore {currentKeywords = newKeywordsbreak}}}return currentKeywords
}// 获取所有文档中的唯一单词
func getUniqueWords(docs [][]string) []string {uniqueWordsMap := make(map[string]struct{})for _, words := range docs {for _, word := range words {uniqueWordsMap[word] = struct{}{}}}uniqueWords := make([]string, 0, len(uniqueWordsMap))for word := range uniqueWordsMap {uniqueWords = append(uniqueWords, word)}return uniqueWords
}// 从唯一单词中随机选择指定数量的关键词
func getRandomKeywords(uniqueWords []string, numKeywords int) []string {if numKeywords > len(uniqueWords) {numKeywords = len(uniqueWords)}keywords := make([]string, numKeywords)perm := rand.Perm(len(uniqueWords))for i := 0; i < numKeywords; i++ {keywords[i] = uniqueWords[perm[i]]}return keywords
}func main() {// 初始化随机种子rand.Seed(time.Now().UnixNano())// 运行爬山算法bestKeywords := hillClimbing(tokenizedDocs, 1000)// 输出结果fmt.Printf("Best keywords found: %v\n", bestKeywords)
}

代码逻辑:

  1. 爬山算法 hillClimbing()‌:

    • 获取所有唯一的单词。
    • 随机选择一组初始关键词。
    • 对于指定的迭代次数:
      • 计算当前关键词集的TF-IDF总和。
      • 尝试替换一个关键词。
      • 如果新关键词集的TF-IDF总和更高,则更新当前关键词集。
    • 返回最终的关键词集。
  2. 辅助函数

    • calculateTFIDF():计算给定单词的TF-IDF值。
    • countOccurrences():统计单词在所有文档中出现的次数。
    • countDocumentsWithWord():统计包含特定单词的文档数量。
    • getUniqueWords():获取所有文档中的唯一单词。
    • getRandomKeywords():从唯一单词中随机选择指定数量的关键词。  

运行结果:

Best keywords found: [爱 前进 太阳升 向 我们]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全设计 | CISA:构建不可侵犯的代码,软件安全设计的未来之路

软件制造商在产品设计和开发过程中应采取安全设计原则和方法&#xff0c;以减少网络安全风险&#xff0c;并转变责任重心&#xff0c;使产品在设计时就内置安全特性&#xff0c;而不是依赖于后期的补丁和修复。为此CISA发布了《软件安全设计的原则和方法》&#xff0c;帮助软件…

兵器室管控系统|DW-306是一套成熟系统

概述 智慧兵器室管理系统&#xff08;DW-S306&#xff09;是依托互3D技术、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 本解决方案利用现有内部网络&#xff0c;部署部队智能兵器室管理系统&#xff…

【Java】欸...?我学集合框架?真的假的?

【Java】欸…&#xff1f;我学集合框架&#xff1f;真的假的&#xff1f; Java集合框架 概述 Java集合框架主要由以下几个部分组成&#xff1a; 接口&#xff08;Interfaces&#xff09;&#xff1a;定义了集合的基本操作&#xff0c;如添加、删除、遍历等。实现&#xff0…

ResNet 学习

一. 残差块与残差层 简单来说&#xff0c;残差块是构成残差层的基本单元&#xff0c;而残差层则是由多个残差块组成的。在ResNet中&#xff0c;通常会堆叠多个残差层来构建深度模型。 (一).残差块&#xff08;Residual Block&#xff09; 这是ResNet的基本构建单元。一个残差块…

大语言模型的工程技巧(二)——混合精度训练

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 混合精度训练的示例请参考如下链接&#xff1a;regression2chatgpt/ch11_llm/gpt2_lora_optimum.ipynb 本文将讨论如何利用混合…

将本地HtmL网站打包成exe

将本地HTML网站打包成exe文件&#xff0c;可以使用工具如NW.js、Electron等。这些工具允许你将HTML、CSS和JavaScript打包成一个独立的可执行文件。下面以Electron为例&#xff0c;介绍具体步骤&#xff1a; 准备工作 安装Node.js和npm&#xff1a; Electron依赖于Node.js和np…

Java语法篇-易错

文章目录 类型转换switch case类之间关系及UMLtry catch finally 类型转换 隐式类型转换&#xff0c;不同数值类型参与计算时&#xff0c;低精度会转化为高精度参与运算 byte,short,char参与整数运算时会转成int float,int 参与浮点数运算时会转成double 强制类型转换 高精…

数据结构 —— 栈 与 队列

1.栈 1.1栈的结构和概念 栈&#xff08;Stack&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;的原则。栈只允许在一端插入和删除数据&#xff0c;这一端被称为栈顶&#xff08;top&#xff09;&a…

c++引用和内联函数

一、引用 1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;引用类型必须和引用实体是同种类型的&#xff09;&#xff0c;如&#x…

MySQL--联合索引应用细节应用规范

目录 一、索引覆盖 1.完全覆盖 2.部分覆盖 3.不覆盖索引-where条件不包含联合索引的最左则不覆盖 二、MySQL8.0在索引中的新特性 1.不可见索引 2.倒序索引 三、索引自优化--索引的索引 四、Change Buffer 五、优化器算法 1.查询优化器算法 2.设置算法 3.索引下推 …

2024年NGFW防火墙安全基准-防火墙安全功效竞争性评估实验室总结报告

Check Point 委托 Miercom 对 Check Point 下一代防火墙 (NGFW) 开展竞争性安全有效性测试&#xff0c; 选择的竞品分别来自 Cisco、Fortinet 和 Palo Alto Networks。对 Zscaler 的测试涉及他们的 SWG&#xff08;安全网关&#xff09;。测试内容包括验证防病毒、反恶意软件、…

SpringBoot+Vue开发记录(六)-- 后端配置mybatis

原型图什么的就先不管&#xff0c;后面再写。 本篇文章的主要内容就是springboot通过mybatis操作数据库实现增删改查。 重点是mybatis配置与相关文件数据&#xff0c;以后开新项目忘记了怎么配置的话可以再照着这个搞。 这算是最基础的部分了吧。 文章目录 一&#xff0c;配置…

基于STM32的自动宠物喂食器的Proteus仿真

文章目录 一、宠物喂食器1.题目要求2.思路2.1 OLED显示汉字2.2 DS1302模块2.3 液位传感器2.4 压力传感器和步进电机驱动 3.仿真图3.1 未仿真时3.2 开始仿真&#xff0c;OLED初始界面显示实时时间3.3 通过设置按键进入模式选择和喂食时间设置3.4 进入喂食时间设置3.5 设置好喂食…

计算机毕业设计Python+Spark+PyTroch游戏推荐系统 游戏可视化 游戏爬虫 神经网络混合CF推荐算法 协同过滤推荐算法 steam 大数据

毕业设计&#xff08;论文&#xff09; 基于SpringBoot的游戏防沉迷系统的设计与实现 摘 要 随着网络游戏市场的持续火爆,其最明显的负面影响----“网络游戏沉迷问题”已成为当前社会普遍关心的热点问题。根据2010年8月1日实施的《网络游戏管理暂行办法》&#xff0c;网络游…

代码随想录算法训练营第三十四天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

860.柠檬水找零 遇到账单20&#xff0c;优先消耗美元10&#xff0c;完成本次找零。因为5的用处更大&#xff0c;等到循环结束的时候&#xff0c;如果存在某个美元不够用的情况&#xff0c;那么就是无法找零。 406.根据身高重建队列 先考虑身高维度&#xff0c;将身高从大至小…

图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 顺序表的学习&#xff0c;点我 目录 图书管理系统菜单 基本框架&#xff1a; 书&#xff1a; 书架&#xff1a; 用户&#xff…

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等&#xff0c;要用Objects的equals方法&#xff0c;而不是用对象自己的equals方法来解决呢&#xff1f; Objects&#xff1a; Objects类是一个工具类&#xff0c;提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…

python使用pandas操作xlsx

python操作xlsx有很多种方法&#xff0c;以前使用其他控件操作&#xff0c;使用这个pandas之后发现更好用。场景&#xff0c;我需要读取xlsx模板&#xff0c;然后根据模板去获取数据&#xff0c;根据用户要求导出指定的xlsx文件。 读取文件 data pd.read_excel(sleepStageAh…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…