You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express Node.js后端实现JavaScript词频统计?

搞定Express后端的PDF文本词频统计

我来帮你把这个词频统计的逻辑补全!看你已经完成了文件上传、PDF读取和文本分块的部分,接下来只需要把文本处理和词频统计的逻辑补上就行,我给你梳理完整的实现方案:

核心思路

  1. 初始化一个空对象用来存储每个单词的出现次数
  2. 对每个PDF提取的文本块做预处理:统一转小写、分割单词、清理无效字符
  3. 遍历所有单词,更新词频统计对象
  4. 处理异步操作的问题(因为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:09