package com.DocExpansion.TFIDF;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class TFfreq {
public static HashMap<String,String> TFfreq(ArrayList<String> terms){
//计算词频
HashMap<String,String> resTF=new HashMap<String,String>();
HashMap<String,Integer> TFtimes=TFfreq.TFtimes(terms);
int length=terms.size();
System.out.println(length);
//遍历Map的value
Iterator iter=TFtimes.entrySet().iterator();
while(iter.hasNext()){
Map.Entry entry=(Map.Entry)iter.next();
//当两个整数相除时,由于小数点以后的数字会被截断,使运算结果为整数,
//故此时若希望得到运算结果为所预期的浮点数,则此时必须将两整数其一或是全部强制转换类型为浮点数。
DecimalFormat decimalFormat = new DecimalFormat("#,##0.0000000000");//格式化设置
float freq=Float.parseFloat(entry.getValue().toString())/length;
resTF.put(entry.getKey().toString(),decimalFormat.format(freq));
}
return resTF;
}
public static HashMap<String,Integer> TFtimes(ArrayList<String> terms){
//统计词出现的次数
HashMap<String,Integer> TFtimes=new HashMap<String,Integer>();
for(String term:terms){
if(!TFtimes.containsKey(term)){
TFtimes.put(term, 1);
}
else {
TFtimes.put(term, TFtimes.get(term)+1);
}
}
//因为Iterator在循环的时候是不可以删除元素的。
/*Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
if(TFtimes.get(key)>2&&TFtimes.get(key)<1000){
TFtimes.remove(key);
}
}*/
//遍历HashMap
//1、使用迭代器遍历Map的值,根据键取值
Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
Object value=TFtimes.get(key);
System.out.println("-------"+key+" "+value);
}
//2、使用迭代器遍历Map的记录Map.Entry
Iterator iter=TFtimes.entrySet().iterator();
while(iter.hasNext()){
//一个Map.Entry代表一条记录
Map.Entry entry=(Map.Entry)iter.next();
//通过entry可以获得记录的键和值
Object key=entry.getKey();
Object value=entry.getValue();
System.out.println("++++++++"+key+" "+value);
}
return TFfreq.Sort(TFtimes);
}
//排序HashMap并删除元素
public static HashMap<String,Integer> Sort(HashMap<String,Integer> map){
HashMap<String,Integer> resMap=new HashMap<String,Integer>();
List<Map.Entry<String, Integer>> infoIds=new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
Collections.sort(infoIds,new Comparator<Map.Entry<String, Integer>>(){
public int compare(Map.Entry<String, Integer> o1,Map.Entry<String, Integer> o2){
//根据value排序,整型
return(o1.getValue()-o2.getValue());
//根据key排序,字符型
// return(o1.getKey().toString().compareTo(o2.toString()));
}
});
//根据值的大小删除元素
for(int i=0;i<infoIds.size();i++){
Entry<String,Integer> id=infoIds.get(i);
if(id.getValue()>2&&id.getValue()<1000){
resMap.put(id.getKey(), id.getValue());
}
}
return resMap;
}
}
删除集合中的某些元素。有些可能会这么写。
Iterator it=TFtimes.keySet().iterator();
while(it.hasNext()){
Object key=it.next();
if(TFtimes.get(key)>2&&TFtimes.get(key)<1000){
TFtimes.remove(key);
}
}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
因为Iterator在循环的时候是不可以删除元素的。
分享到:
相关推荐
5. **统计词频**: - 遍历每个单词,如果在HashMap中存在,更新其值;如果不存在,则添加新键值对。 - 可以使用`AtomicInteger`或`synchronized`关键字保证并发安全,如果需要在多线程环境中进行统计。 6. **结果...
- **额外操作**:为了获取高频词,通常还需要对统计结果进行排序,这会进一步增加时间和空间开销。 #### 单词树(Trie)优化方案 为了解决上述问题,可以考虑使用单词树(Trie)数据结构来替代`HashMap`。单词树是...
- `HashMap`提供了O(1)级别的平均时间复杂度来进行添加、删除和查找操作。 - 在大多数情况下,使用`HashMap`能够满足高效统计字符的需求。 #### 三、扩展知识 1. **其他数据结构的选择** - 如果需要按字符出现...
源代码部分可能会包含处理文本、统计词频、实现排序和显示结果的类或函数。通过阅读和理解这些代码,可以深入学习到如何将上述理论知识应用到实际的C#项目中。 总的来说,这个软件的实现涵盖了数据处理、算法应用和...
在这个项目中,我们可以使用JFrame创建主窗口,JButton作为按钮接收用户的操作,JTextArea展示文件内容或统计结果,JTable则可以用来显示词频统计的详细信息,如单词、频率和排名。 在英文词频检测统计的过程中,...
- 方案1:使用哈希取模将文件切分为小文件,对每个小文件统计词频,使用最小堆选出前100高频词,再进行归并排序。 4. 最频繁IP查找: - 方案1:筛选特定日的百度访问IP,按哈希取模生成小文件,统计每个文件的...
统计词频则需要用到哈希数据结构,例如`HashMap`,它能提供O(1)的时间复杂度来插入和查找元素。我们可以为每个词创建一个键值对,键是词,值是词频。 ```java Map, Integer> wordCount = new HashMap(); // 分词后...
// 统计词频 Map, Integer> frequencyMap = countWords(words); // 按频率降序排列 Map, Integer> sortedMap = sortMapByValue(frequencyMap, false); // 打印结果 printWordFrequency(sortedMap); } ...
5. **排序与展示**:统计完成后,可能需要按照词频对结果进行排序。Java的`Collections.sort()`方法结合自定义的比较器可以实现这个功能。最后,可以将结果输出到控制台或者写入新的文件,以便查看和分析。 6. **...
5. **统计词频** 词频统计是网络爬虫常见的应用之一,可以用于分析网站内容的主题。首先,我们需要提取所有文本,然后对文本进行分词,最后统计每个词出现的次数。这里可以使用Java的`StringTokenizer`和`HashMap`...
8. **字典树在统计词频上的应用**:字典树可以高效地统计词频,每个节点表示一个字符串,节点的子节点代表该字符串的后缀,统计词频时只需遍历对应路径。 9. **红黑树的特性与应用**:红黑树是一种自平衡二叉查找树...
3. **统计词频**:使用`HashMap`来存储单词及其出现的次数。遍历处理后的单词数组,每次遇到一个单词,如果不在字典中,添加到字典并设置计数为1;如果已经在字典中,将其计数加1。 ```java Map, Integer> ...
源代码可能分为多个类,如`TextParser`用于读取和解析文本,`WordCounter`用于统计词频,`TagCloudGenerator`负责生成HTML,以及可能的`Main`类用于整合整个流程。测试用例可以帮助验证代码的正确性,而README文件...
最后,我们可以遍历这个数据结构,输出出现频率最高的单词或者按照频率排序。 接下来,是素数检测的部分。素数是指大于1且除了1和它自身以外没有其他正因数的自然数。Java中实现素数检测的方法有很多种,例如最基础...
3. **词频分析**:通过统计单词出现的频率,可以了解文本的主要主题。可以使用`TreeMap`或`LinkedHashMap`按照频率排序,输出最常出现的单词。 4. **句子和段落计数**:使用正则表达式分割文本为句子或段落,然后...
在 `dicey-master` 项目中,可能包含了利用以上 Kotlin 功能实现的字典操作、文本处理逻辑,甚至可能包括了一些特定的算法,如词频统计、文本分析等。通过阅读源码,我们可以更深入地了解如何在 Kotlin 中高效地处理...
文件名"WordCount-main"暗示了这可能是一个关于词频统计的项目,常见于大数据处理或文本挖掘中。在Hadoop等分布式计算框架中,WordCount是一个经典的入门示例,它展示了如何用MapReduce模型统计文本文件中单词的出现...