Word Frequency

本文介绍如何使用Shell脚本读取文本文件,统计其中单词的频度,并按照频度倒序输出。通过tr、sort、uniq、sort和awk等命令实现文本处理和排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:写一段shell脚本来将一个文本文件中出现的单词的频度进行统计,并按照频度大小倒序输出。假设每行的单词都是由一个空格分隔的,并且假设任何两个单词的频度都不相同。比如文本为:

the day is sunny the the
the sunny is is

则输出为:

the 4
is 3
sunny 2
day 1

代码如下:

# Read from the file words.txt and output the word frequency list to stdout.
tr -s ' ' '\n' < words.txt  | sort | uniq -c | sort -nr | awk '{print $2, $1}'

解析:tr 用来将空格替换成"\n", -s选项会保证不会出现多余的换行,具体用法参见帮助手册。之后文本就变成了每个单词一行,如下所示:

the
day
is
sunny
the
the
the
sunny
is
is

再调用sort对单词进行排序,相同的单词则在相同的行,如下所示:

day
is
is
is
sunny
sunny
the
the
the
the


之后调用uniq 并用-c选项统计每个单词的频度,文本如下所示:

1 day
3 is
2 sunny
4 the

之后再调用sort 用-nr选项让文本根据数字倒序排列,文本如下所示:

4 the
3 is
2 sunny
1 day

之后再调用 awk将第一列和第二列互换一下达到最后目的,最终文本如下:

the 4
is 3
sunny 2
day 1

另解:最前面将每个单词放在一行上面也可以用sed来进行替换操作

sed -r 's/\s+/\n/g' words.txt  | sed '/^$/d' | sort | uniq -c | sort -nr | awk '{print $2, $1}'

第一次sed操作之后如果文本的某一行开头有空格,则转换后的文本会出现空行,所以可以通过第二个sed操作去除空行,其中第一个sed的-r选项表示采用扩展的正则表达式,以便支持\s以及+等符号。
<think>好的,用户想了解关于词频统计的方法和工具,特别是在文本分析或编程中的应用。首先,我需要回顾一下常见的词频统计方法,包括基本步骤和不同的实现方式。然后,考虑有哪些工具或库可以使用,比如Python中的NLTK、collections模块,或者在线工具如WordCloud。 接下来,用户可能需要具体的代码示例,所以得准备一些Python的例子,比如使用Counter或者NLTK的FreqDist。同时,要注意用户提到的系统级指令,比如数学表达式要用$...$,独立公式用$$...$$,并且生成相关问题。 还要检查是否有需要引用的地方,比如引用站内的资料,例如提到的NLTK和信息熵的例子。需要确保引用标识正确添加在相关段落末尾。 然后,用户的问题可能涉及中英文处理,所以需要提到分词工具如jieba。另外,高级方法如TF-IDF和词云生成也是重要的部分,应该涵盖这些内容,并给出相应的工具或库。 最后,按照要求生成相关问题,这些问题应该围绕词频统计的扩展应用、不同工具的比较、处理多语言的方法以及如何优化性能等方面。要确保问题自然且有启发性,帮助用户深入理解主题。 总结步骤: 1. 介绍词频统计的基本概念。 2. 分方法说明:基础统计、高级分析、可视化工具。 3. 提供编程工具和示例代码。 4. 提及在线工具。 5. 添加引用。 6. 生成相关问题。</think>### 词频统计方法与工具 #### 一、词频统计方法 1. **基础词频统计** 统计文本中每个单词的出现次数,核心公式为: $$f(w) = \frac{N_w}{N_{total}}$$ 其中$N_w$为单词$w$的出现次数,$N_{total}$为总词数[^1]。 2. **高级分析方法** - **TF-IDF**:衡量单词在文档中的重要性 $$ \text{TF-IDF}(w) = \text{TF}(w) \times \log\left(\frac{N_{doc}}{1 + \text{DF}(w)}\right) $$ - **停用词过滤**:移除常见无意义词汇(如"the", "and") - **词干提取**:将变形词统一为词根(如"running"→"run") #### 二、编程工具与代码示例 1. **Python标准库** ```python from collections import Counter text = "apple banana orange apple" word_counts = Counter(text.split()) print(word_counts.most_common(2)) # 输出[('apple',2), ('banana',1)] ``` 2. **NLTK库(自然语言处理工具包)** ```python import nltk from nltk import FreqDist tokens = nltk.word_tokenize("Hello world. Hello NLP.") fdist = FreqDist(tokens) print(fdist.most_common(1)) # 输出[('Hello', 2)] ``` 3. **中文处理工具** - **jieba分词**:用于中文分词预处理 ```python import jieba text_cn = "自然语言处理很有趣" words = jieba.lcut(text_cn) ``` #### 三、可视化工具 1. **WordCloud库生成词云** ```python from wordcloud import WordCloud import matplotlib.pyplot as plt wc = WordCloud().generate(text) plt.imshow(wc) plt.axis("off") ``` 2. **在线工具** - Voyant Tools(支持多语言实时分析) - TagCrowd(快速生成交互式词云) #### 四、性能优化技巧 - 使用生成器处理大文件 - 结合正则表达式过滤特殊字符 - 多进程并行处理(如Dask库) [^1]: 词频统计基础方法参考NLTK文档实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值