正文索引 [隐藏]

最近收到软件工程课程老师的一个实验作业,其中涉及到了一部分NLP的内容,这里捡出来一些整理下来。

需求

输出单个文件中的前 N 个最常出现的英语单词。
作用:一个用于统计文本文件中的英语单词出现频率的控制台程序
单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词
以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

思路

统计个数优先考虑字典。先把文章里的标点和多余空格处理掉,然后把整篇文章处理成一个单词列表,再去count这个列表里的元素就可以了。最后做一下排序。

代码

#-*- coding: UTF-8 -*-
# 需求:输出单个文件中的前 N 个最常出现的英语单词。

# 获取文本内容,分隔单词
def get_words(filename):
    with open(filename) as f:
        content = f.read()
        # 处理标点符号
        content = content.replace(",", "")
        content = content.replace(".", "")
        content = content.replace("!", "")
        content = content.replace("?", "")
        # 处理首尾空格
        content = content.strip()
        # 生成单词列表
        words = [word.lower() for word in content.split()]
        # print(words)
        return words
# 单词计数
def count_words(filename):
    # 获取单词列表
    words = get_words(filename)
    # 通过列表生成字典
    words_amount = dict.fromkeys(words, 0)
    # 遍历单词
    for word in words_amount.keys():
        # 计数统计
        cnt = words.count(word)
        words_amount[word] = cnt
    # 根据频数降序排序
    words_amount = sorted(
        words_amount.items(), 
        key=lambda x:x[1], 
        reverse=True
    )
    return words_amount
# 主函数
if __name__ == "__main__":
    N = 10
    filename = "experiment_1/text.txt"
    words_amount = count_words(filename=filename)
    # print(words_amount)
    # 遍历前N个元素取答案
    for el in words_amount[:N]:
        print('{0:<8} : {1}'.format(el[0], el[1]))