教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载导读本篇文章以《Programming with Text》课程第 5.2 节为核心系统讲解 JavaScript 中关联数组Associative Arrays的概念JavaScript 的对象本质上是名称-值key-value对的集合其行为与 Python 的字典dictionary、Java 的 HashMap 高度一致。你会学到如何用对象构建词频统计表concordance、如何安全地判断键是否存在、如何遍历与排序并看到这一技巧在仓库中词频统计、TF-IDF、马尔可夫链、推文分析等多个实战项目中的真实用法最终能够独立实现一个可运行的中文文本词频统计应用。什么是关联数组JavaScript 对象即键值对集合在大多数编程语言中关联数组指的是通过键key而非数字索引来存取元素的数据结构。JavaScript 中最天然的实现就是普通对象objectvar counts {}; counts[rainbow] 5; counts[sky] 3;每个对象都是一组无序的键值对键必须是字符串或可被转换为字符串的符号值可以是任意类型——数字、字符串、数组甚至另一个对象。这与课程文档中所强调的观点一致它和 Python 的字典、Java 的 HashMap 在概念上基本相同。三种基本读写方式// 方式一对象字面量初始化 var counts { rainbow: 5, sky: 3 }; // 方式二点号访问键必须是合法标识符 counts.rainbow 5; // 方式三方括号访问键可以是变量或含特殊字符的字符串 var key rainbow; counts[key] 5; counts[a b] 1; // 含空格也能作为键方括号写法之所以关键是因为键可以来自变量——在文本处理中我们往往是在循环里拿到一个词然后动态决定把它存到哪个键下面这正是关联数组在文本分析中的核心价值。与 Python 字典、Java HashMap 的对照课程文档明确指出 JavaScript 的关联数组与 Python 字典、Java HashMap 工作方式大致相同三者对照如下特性JavaScript 对象Python 字典Java HashMap创建{}或new Object(){}或dict()new HashMap()插入obj[key] valued[key] valuemap.put(key, value)读取obj[key]d[key]map.get(key)判断键存在obj.hasOwnProperty(key)key in dmap.containsKey(key)获取所有键Object.keys(obj)d.keys()map.keySet()需要特别注意一个 JavaScript 特有的陷阱用obj[key]直接读取不存在的键不会报错而是返回undefined。这一点与 Python抛KeyError、Java返回null都不同因此在计数场景中我们常用先判断undefined再初始化的写法见下文词频统计代码。实战一用关联数组构建词频统计器Word Counter课程文档指出关联数组这一概念在词频统计相关的 Coding Challenge 中会极其有用。仓库中 CC_040.1 词频统计挑战 正是这一技巧的直接落地其完整实现位于 CodingChallenges/CC_040.1_wordcounts/P5/sketch.jsvar txt; var counts {}; // 关联数组词 - 出现次数 var keys []; function preload() { txt loadStrings(rainbow.txt); // 逐行读取文本文件 } function setup() { var allwords txt.join(\n); var tokens allwords.split(/\W/); // 用正则切分出单词 for (var i 0; i tokens.length; i) { var word tokens[i].toLowerCase(); if (!/\d/.test(word)) { // 过滤纯数字 if (counts[word] undefined) { // 键尚不存在 counts[word] 1; keys.push(word); // 记录键的插入顺序 } else { counts[word] counts[word] 1; // 已有则累加 } } } keys.sort(compare); // 按出现次数从高到低排序 function compare(a, b) { var countA counts[a]; var countB counts[b]; return countB - countA; } for (var i 0; i keys.length; i) { var key keys[i]; createDiv(key counts[key]); // 输出 词 次数 } noCanvas(); }这段代码展示关联数组在文本分析中的四个典型用法动态建键counts[word]的键来自运行时循环中的单词变量安全判空用counts[word] undefined判断这个词第一次出现从而区分置 1与累加键的排序keys.sort(compare)借助counts[a]与counts[b]取到两个键对应的计数值进行比较实现按词频降序输出结果渲染createDiv(key counts[key])将关联数组扁平化为可读的文本列表。配套的数据文件为 CodingChallenges/CC_040.1_wordcounts/P5/rainbow.txt维基百科彩虹词条运行入口 index.html 通过 CDN 引入 p5.js 并加载sketch.js即可在浏览器中看到每行单词 次数的统计输出。该挑战对应视频 040.1 明确说明它演示了关联数组、正则表达式以及本课程此前覆盖的其他技术。实战二Processing 中的对应实现——IntDict如果使用 ProcessingJava环境可以查看同一挑战的 Java 版本 CC_040_1_wordcounts.pde它使用 Processing 内置的IntDict字符串到整数的映射完成了相同的计数逻辑对应挑战 040.2IntDict counts; counts new IntDict(); String[] lines loadStrings(rainbow.txt); String allwords join(lines, \n); String[] tokens splitTokens(allwords, \n\ ,;.?!); for (int i 0; i tokens.length; i) { String word tokens[i].toLowerCase(); if (counts.hasKey(word)) { // 等价于 hasOwnProperty 判断 counts.increment(word); // 已有键则自增 } else { counts.set(word, 1); // 新键初始化为 1 } } String[] keys counts.keyArray(); for (String k : keys) { int count counts.get(k); // 取键对应的计数 textSize(count); float x random(width); float y random(height); text(k, x, y); // 以词频作为字号可视化 }注意 Java 版本的处理方式差异counts.hasKey(word)对应 JavaScript 的hasOwnProperty或! undefined判断counts.increment(word)把判断 自增封装为一步。该版本还演示了关联数组的典型可视化用词频值直接映射textSize(count)出现越多的词字号越大。实战三值也可以是对象——嵌套关联数组关联数组的值不限于数字。仓库中的推文分析项目 CC_048_TweetsByMonth/P5/sketch.js 展示了两层嵌套的关联数组外层以月/年为键内层再以单词为键值则是一个{ total, words }对象var counts {}; // 月/年 - { total, words } if (counts.hasOwnProperty(key)) { counts[key].total; } else { counts[key] { total: 1, words: {} // 内层关联数组词 - 次数 }; } // ... if (counts[key].words.hasOwnProperty(word)) { counts[key].words[word]; } else { counts[key].words[word] 1; }这里同时演示了hasOwnProperty(key)的判键写法与! undefined等效且能避免访问到继承属性以及如何用Object.keys(counts)取出所有月份键并reverse()后绘制柱状图。代码中还给出了一个实用技巧用一个忽略词表对象ignore { the: true, to: true, ... }通过!ignore[word]快速过滤掉the、to、of等高频停用词——这正是把关联数组当作**集合set**使用的常见模式。进阶关联数组在 TF-IDF 与马尔可夫链中的应用词频统计只是起点关联数组还支撑着更多文本分析算法TF-IDFCC_040.3 TF-IDF 挑战 的 sketch.js 把每个词映射为一个对象{ tf: 1, df: 1 }记录词频与文档频率最后计算tfidf tf * log(files.length / df)并按 TF-IDF 值排序用于关键词提取马尔可夫链CC_042.1 马尔可夫链 用ngrams[gram] []把每个 n-gram 片段映射到下一个字符的数组生成文本时通过random(possibilities)随机挑选后继字符——关联数组在这里充当了概率转移表的角色。这些项目共同印证了课程文档的判断关联数组是文本分析与生成类算法的基础设施。使用关联数组的关键注意事项结合以上源码实践总结几条可靠经验键不存在时读取返回undefined计数前务必用counts[key] undefined或counts.hasOwnProperty(key)判断否则会出现NaN或意外覆盖键会被强制转为字符串counts[1]与counts[1]指向同一个键混用数字与字符串键时需注意hasOwnProperty优于key in obj后者会把原型链上的属性也算进去仓库推文示例中正是采用hasOwnProperty写法遍历顺序Object.keys(obj)返回键的数组可按需排序如按词频降序适合与sort组合输出排行榜避免污染原型当键名来自外部文本时像__proto__、constructor这类特殊键可能带来安全隐患严谨场景建议使用Object.create(null)创建无原型的对象。小结与延伸学习关联数组键值对对象是 JavaScript 文本处理的地基从本课的 5.1 节概览文本分析与词频统计到 5.3 节作业围绕词频与文本分析的练习再到仓库中 40.1 词频统计、40.2 Processing 版、40.3 TF-IDF 以及推文可视化、马尔可夫链等挑战无不是以用对象按词建键、按值计数、按键排序这一核心模式展开。掌握本文的判键、累加、遍历、排序四步套路你就能把任意文本快速转化为可分析、可可视化的结构化数据。赞分享教程文档示例工程【免费下载链接】website-archiveArchive of the Coding Train website (first version)项目地址https://gitcode.com/gh_mirrors/we/website-archive点击查看免费下载相关推荐TextBlob词频统计5个步骤掌握文本关键词分布的完整方法TextBlob词频统计5个步骤掌握文本关键词分布的完整方法 TextBlob是一个强大的Python文本处理库专门用于文本分析和自然语言处理任务。通过TeNLP人工智能用 jq 的 add 函数将键值对对象数组合并为单个对象用 jq 的 add 函数将键值对对象数组合并为单个对象 导读 在处理 JSON 数据时 jq 的 map 加动态键语法 { .slug : .amount文档教程知识库PostgreSQL hstore用两个数组创建键值对记录create hstore from two arraysPostgreSQL hstore用两个数组创建键值对记录create hstore from two arrays 导读 PostgreSQL 的 hs文档教程知识库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考