统计英文单词词频

统计英文单词词频–Java

思想:首先英文文章中有很多标点符号,所以我们不妨把所有的标点或者与英文单词无关的字符变成空格,之后把所有的单词按空格切分装进数组里,然后用集合统计单词的词频,最后排序,废话不多说,直接上代码。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;


public class WordFrequency {
    public static String Read_File(String filename) {
        // TODO Auto-generated method stub
        String line = null;
        StringBuffer sb = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new FileReader(filename));
            while((line = br.readLine()) != null){
                sb.append(line + "\n");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sb.toString();//读文件,将文章中的所有句子变成一个字符串。

    }

    public static HashMap Char_to_Space(String article) {
        // TODO Auto-generated method stub
        String space = " ";
        article = article.replaceAll("\"",space).replaceAll(",", space).replaceAll("\\.", space);
        article = article.replaceAll(":", space).replaceAll("\\?", space);//用空格替换标点,当然这种方法很拙劣,笔者只是为了省事,最好还是用正则。
        article = article.replaceAll("\\s+", " ");//多个空格变成一个空格
        article = article.toLowerCase();//将所有单词转换为小写

        String[] wordlist = article.split(" ");//分割单词
        HashMap<String,Integer> hm = new HashMap();
        for(String word : wordlist){
            if(hm.containsKey(word)){
                Integer count = hm.get(word);
                count ++;
                hm.put(word, count);
            }
            else{
                hm.put(word, 1);
            }
        }
        //System.out.println(hm);
        //System.out.println(article);
        return hm;
    }

    //排序,这里是按照value排序。
    public static void Sort(HashMap hm) {
        // TODO Auto-generated method stub
        ArrayList <Map.Entry<String, Integer>> list = new ArrayList(hm.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() {

            @Override
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2) {
                // TODO Auto-generated method stub
                return o1.getValue() - o2.getValue();
            }

        });

        System.out.println(list);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filename = "D:\\word.txt";
        String article = Read_File(filename);
        HashMap hm = Char_to_Space(article);
        Sort(hm);
    }   

}

另外,更多HashMap排序请戳这里

### 实现英文单词词频统计 为了实现英文单词词频统计功能,可以采用如下方法: 定义结构体用于存储单词及其对应的频率。此结构体包含两个成员变量:一个是字符串类型的`word`用来保存单词本身;另一个是整型的`frequency`表示该单词出现次数。 创建哈希表或链表来管理这些结构体实例。当读取文件中的每一个新单词时,在数据结构里查找是否存在相同项。如果存在,则增加其计数器;反之则新增记录并初始化计数值为1。 最后遍历整个数据集合输出所有条目的键值对即完成任务[^1]。 下面是一个简单的 C 语言代码示例,展示了如何实现上述逻辑: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_WORD_LENGTH 50 #define HASH_SIZE 1024 typedef struct WordFrequency { char word[MAX_WORD_LENGTH]; int frequency; } WordFrequency; WordFrequency* hashTable[HASH_SIZE]; unsigned long HashFunction(const char *str) { unsigned long hash = 5381; int c; while ((c = *str++)) hash = ((hash << 5) + hash) + tolower(c); /* hash * 33 + c */ return hash % HASH_SIZE; } void InsertOrUpdate(char *word) { unsigned long index = HashFunction(word); WordFrequency **entryPtr = &hashTable[index]; while (*entryPtr != NULL && strcmp((*entryPtr)->word, word) != 0) entryPtr = (WordFrequency **)&(*entryPtr)[index]; if (*entryPtr == NULL) { // 新增词条 *entryPtr = malloc(sizeof(WordFrequency)); strcpy((*entryPtr)->word, word); (*entryPtr)->frequency = 1; } else { // 更新已有词条 ++(*entryPtr)->frequency; } } int main() { FILE *filePointer; filePointer = fopen("input.txt", "r"); if (!filePointer) { printf("无法打开文件\n"); exit(EXIT_FAILURE); } char buffer[MAX_WORD_LENGTH]; while(fscanf(filePointer,"%s",buffer)!=EOF){ InsertOrUpdate(buffer); } fclose(filePointer); for(int i=0;i<HASH_SIZE;++i){ if(hashTable[i]!=NULL){ printf("%s : %d\n",hashTable[i]->word , hashTable[i]->frequency ); } } return EXIT_SUCCESS; } ``` 这段程序实现了基本的英文单词词频统计功能,并且能够处理大小写字母不敏感的情况。对于更复杂的应用场景可能还需要考虑去除标点符号等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值