问题:
java语言编辑,实现TF-IDF算法 :用于文本特征提取。
解答思路:
TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的文本特征提取方法,用于评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。以下是一个使用Java实现TF-IDF算法的简单示例:
import java.util.*;
import java.util.regex.Pattern;
public class TFIDF {
private Map<String, Integer> wordFrequency;
private Map<String, Integer> docFrequency;
private int totalDocuments;
public TFIDF(int totalDocuments) {
this.wordFrequency = new HashMap<>();
this.docFrequency = new HashMap<>();
this.totalDocuments = totalDocuments;
}
// 计算TF(词频)
public Map<String, Double> calculateTF(List<String> words) {
Map<String, Double> tf = new HashMap<>();
int totalWords = words.size();
for (String word : words) {
tf.put(word, (double) wordFrequency.get(word) / totalWords);
}
return tf;
}
// 计算IDF(逆文档频率)
public Map<String, Double> calculateIDF(Map<String, Integer> docFrequency) {
Map<String, Double> idf = new HashMap<>();
for (String word : wordFrequency.keySet()) {
idf.put(word, Math.log((double) totalDocuments / docFrequency.get(word)));
}
return idf;
}
// 计算TF-IDF
public Map<String, Double> calculateTFIDF(Map<String, Double> tf, Map<String, Double> idf) {
Map<String, Double> tfidf = new HashMap<>();
for (Map.Entry<String, Double> tfEntry : tf.entrySet()) {
String word = tfEntry.getKey();
double tfValue = tfEntry.getValue();
double idfValue = idf.getOrDefault(word, 0.0);
tfidf.put(word, tfValue * idfValue);
}
return tfidf;
}
// 添加文档到语料库
public void addDocument(List<String> document) {
Set<String> words = new HashSet<>();
for (String word : document) {
wordFrequency.put(word, wordFrequency.getOrDefault(word, 0) + 1);
words.add(word);
}
for (String word : words) {
docFrequency.put(word, docFrequency.getOrDefault(word, 0) + 1);
}
}
public static void main(String[] args) {
// 假设有两个文档
List<String> document1 = Arrays.asList("the", "quick", "brown", "fox");
List<String> document2 = Arrays.asList("the", "lazy", "dog");
TFIDF tfidf = new TFIDF(2);
// 添加文档到语料库
tfidf.addDocument(document1);
tfidf.addDocument(document2);
// 计算TF
Map<String, Double> tf = tfidf.calculateTF(document1);
// 计算IDF
Map<String, Double> idf = tfidf.calculateIDF(tfidf.docFrequency);
// 计算TF-IDF
Map<String, Double> tfidfResult = tfidf.calculateTFIDF(tf, idf);
// 输出TF-IDF结果
for (Map.Entry<String, Double> entry : tfidfResult.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
在上面的代码中,我们首先定义了一个'TFIDF'类,它有三个主要的方法:'calculateTF'计算词频(TF),'calculateIDF'计算逆文档频率(IDF),以及'calculateTFIDF'计算TF-IDF值。我们还有一个'addDocument'方法来添加文档到语料库中,并更新词频和文档频率。
在'main'方法中,我们创建了两个文档的列表,初始化了一个'TFIDF'对象,并添加了这些文档到语料库中。然后,我们计算了第一个文档的TF,IDF,以及TF-IDF值,并将结果打印出来。
这个简单的实现假设所有的词都是小写的,并且没有考虑停用词。在实际应用中,可能需要对文本进行预处理,包括去除标点符号、转换成小写、过滤停用词等。
(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)