如何在Express Node.js后端实现JavaScript词频统计?
搞定Express后端的PDF文本词频统计
我来帮你把这个词频统计的逻辑补全!看你已经完成了文件上传、PDF读取和文本分块的部分,接下来只需要把文本处理和词频统计的逻辑补上就行,我给你梳理完整的实现方案:
核心思路
- 初始化一个空对象用来存储每个单词的出现次数
- 对每个PDF提取的文本块做预处理:统一转小写、分割单词、清理无效字符
- 遍历所有单词,更新词频统计对象
- 处理异步操作的问题(因为PDF解析是异步的,多文件上传时要等所有文件处理完再返回结果)
完整代码实现
upload(req, res, function(err) { if (err) { console.log(err); return res.end('Error'); } else { console.log(req.body); // 初始化词频统计对象 const wordFrequency = {}; // 定义停用词数组(可选,过滤无意义的高频词) const stopWords = ['the', 'and', 'is', 'in', 'a', 'an', 'to', 'of', 'for', 'on']; // 把每个文件的PDF处理包装成Promise,解决异步问题 const processingTasks = req.files.map(fileItem => { return new Promise((resolve, reject) => { // 推荐用异步读取文件,避免阻塞事件循环 fs.readFile(fileItem.path, (readErr, data) => { if (readErr) { reject('读取文件失败: ' + readErr.message); return; } pdfText(data, (parseErr, chunks) => { if (parseErr) { reject('PDF解析失败: ' + parseErr.message); return; } // 遍历每个文本块处理单词 chunks.forEach(textChunk => { // 分割单词:转小写 + 按非字母数字字符分割 + 过滤空字符串和停用词 const words = textChunk.toLowerCase() .split(/\W+/) .filter(word => word.length > 0 && !stopWords.includes(word)); // 更新词频统计 words.forEach(word => { wordFrequency[word] = (wordFrequency[word] || 0) + 1; }); }); resolve(); }); }); }); }); // 等待所有文件处理完成后返回结果 Promise.all(processingTasks) .then(() => { console.log('词频统计结果:', wordFrequency); // 把结果以JSON形式返回给前端 res.json({ success: true, message: '词频统计完成', wordFrequency: wordFrequency }); }) .catch(error => { console.error('处理出错:', error); res.end(error); }); } });
关键细节说明
- 统一大小写:用
toLowerCase()把所有单词转成小写,避免"Hello"和"hello"被统计成两个不同的词 - 清理无效字符:用正则
/\W+/分割文本,能自动去掉标点符号、空格等非字母数字字符 - 过滤停用词:加入停用词数组可以过滤掉无意义的高频词,让统计结果更有价值(你可以根据需求增减停用词)
- 异步处理优化:用
Promise.all处理多文件的异步解析,确保所有文件都处理完再返回结果,避免提前响应的问题 - 异步文件读取:把
fs.readFileSync改成fs.readFile,避免阻塞Node.js的事件循环,提升服务性能
如果还有其他需求,比如按词频排序、导出统计结果,随时调整就行!
内容的提问来源于stack exchange,提问作者Rocking chief
相关产品推荐
相关产品推荐

