当前位置:   article > 正文

三句话,完成英文语料的词频统计_统计语料词汇个数过程

统计语料词汇个数过程

简介

有时候有必要对一个英文语料进行统计,以便发现其中的规律。例如,统计词频从而知道哪些词使用得比较频繁。本文实现了三个函数完成英文语料的统计功能,重点研究在什么条件下能够使语料中90%单词能被人读懂。

数据集

本文使用MASC数据集,下载地址:https://www.anc.org/data/masc/
该数据集是一个开放的社区资源,从更大的语料集Open American National Corpus (OANC)上抽取而成, 由500,000多个单词组成。

统计代码

代码由js写成。对数据集中的每一个文本文档进行分词、去停词处理,统计出现过的每个单词的词频数。最后把统计结果输出到一个文件。

const fs = require('fs');
const { resolve } = require('path');

/**
 * 统计结果,是一个map
 */
let words = new Array();

/**
 * 总词数
 */
let total = 0;

/**
 * 统计一个文件
 * @param {string} filename  文件的文件名
 */
function readFile(filename){
    console.log("正在处理:" + filename);
    var data = fs.readFileSync(filename, 'utf-8');
    var str = data.toString();
    var tokens = str.split(/\W+/) //分词
        .filter((token)=>{return token != '' && ! /^(\w|\d+)$/.test(token)}) // 去停词
        .map((token)=>{return token.toLowerCase()});
    for(let token of tokens){
        if(words[token] === undefined){
            words[token] = 1;
        }else{
            words[token] += 1;
        }
        total += 1;
    }

}

/**
 * 统计一个目录下的所有文件
 * @param {string} path 目录的路径
 */
function readAllFiles(path){
    const files = fs.readdirSync(path);
    for(let file of files){
        var filePath = resolve(path, file);
        var stat = fs.statSync(filePath);
        if (stat.isFile()) {
            readFile(filePath);
        } else if (stat.isDirectory()) {
            readAllFiles(filePath)
        }
    }
}


/**
 * 把统计结果写到文件中
 * @param {string} filename 文件的文件名
 */
function wirteCSV(filename){
    //根据词频由大到小排序
    var wordList = []
    for(let word in words){
        if(typeof(words[word]) == 'number')
            wordList.push({word: word, count: words[word]})
    }

    wordList.sort((a, b)=>{
        if(a.count < b.count) {
            return 1;
        }else if(a.count == b.count){
            return 0;
        }else{
            return -1;
        }
    })

    // 写文件
    let fWrite = fs.createWriteStream(filename);
    fWrite.write("词");
    fWrite.write(",")
    fWrite.write("频数");
    fWrite.write(",");
    fWrite.write("频率");
    fWrite.write(",");
    fWrite.write("累计百分比");
    fWrite.write('\n')
    let accumulate = 0;
    for(let obj of wordList){
        accumulate += obj.count;
        fWrite.write(obj.word);
        fWrite.write(",")
        fWrite.write(obj.count + "");
        fWrite.write(",");
        fWrite.write(obj.count * 100 / (total + 1) + "%");
        fWrite.write(",");
        fWrite.write(accumulate * 100 / (total + 1) + "%");
        fWrite.write('\n')
    }
    fWrite.close();


}

readAllFiles('./spoken');
readAllFiles('./written');
wirteCSV('./wordcout.csv');
console.log("处理完毕");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

结果分析

统计结果如下。左边主要是各个单词在语料中的出现频数、频率,并按照词频由大到小排序。
在这里插入图片描述
如右边上方的图,我们可以发现,词频大小呈指数级下降,很好的符合“长尾理论”。
如右边下方的图,可知,2300左右的词汇量即可覆盖语料中80%的单词。6500左右的词汇量可覆盖语料中90%的单词。因此,如果人类掌握了上图中前6500词,则能读懂语料中90%词汇。

展望

该语料集比较小,可能不能很好的反应规律。如果能够在更大语料集中统计,并且如果语料是日常语料,则可统计外国人日常的英文词频。我们则可以有的放矢地去记忆单词。
本文的词频统计方法与语料规模无关,可直接用于更大的语料。

关注我,学习更多编程小技巧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/109642?site
推荐阅读
相关标签
  

闽ICP备14008679号