建立文本数据数学描述的过程分为三个步骤:文本预处理、建立向量空间模型和优化文本向量。文本预处理主要采用分词、停用词过滤等技术将原始的文本字符串转化为词条串或者特点的符号串。文本预处理之后,每一个文本的词条串被进一步转换为一个文本向量,向量的每一维对应一个词条,其值反映的是这个词条与这个文本之间的相似度。相似度有很多不同的计算方法,所以优化文本向量就是采用最为合适的计算方法来规范化文本向量,使其能更好地应用于文本分类和文本聚类等方面。
TFIDF算法
TF-IDF使得一个单词能尽量与文本在语义上相关。TF-IDF算法的实现步骤:
经过试验发现,用TFIDF/max(TFIDF)的方法效果是最好的,具体代码如下:
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* 经过试验发现,用TFIDF/max(TFIDF)的方法效果是最好的
* @author Angela
*/
public class TFIDF {
private Map<String,Integer> TF;//文本词频集
private Map<String,Double> IDF;//特征-逆文档频率集
/**
* 构造方法,初始化TF和IDF
*/
public TFIDF(Map<String,Integer> TF,Map<String,Double> IDF){
this.TF=TF;
this.IDF=IDF;
}
/**
* 计算文本特征集的tf-idf权值
* @return filePath文件的特征-TFIDF集
*/
public Map<String,Double> getTFIDF(){
Map<String,Double> tfidf=new HashMap<String,Double>();
for(Map.Entry<String,Integer> me: TF.entrySet()){
String f=me.getKey();
double weight=me.getValue()*IDF.get(f);
tfidf.put(f, weight);
}
return tfidf;
}
/**
* 计算文本特征集的对数tf-idf权值
* @return filePath文件的特征-TFIDF集
*/
public Map<String,Double> getLogTFIDF(){
Map<String,Double> tfidf=new HashMap<String,Double>();
for(Map.Entry<String,Integer> me: TF.entrySet()){
String f=me.getKey();
double tf=1+Math.log(me.getValue());
double weight=tf*IDF.get(f);
tfidf.put(f, weight);
}
return tfidf;
}
/**
* 进行规一化,每一个特征除以这篇文本TFIDF值之和,构成新的TFIDF集
* @return filePath文件的特征-标准化TFIDF集
*/
public Map<String,Double> getNormalTFIDF(){
Map<String,Double> tfidf=new HashMap<String,Double>();
Map<String,Double> weight=getTFIDF();
double sum=MathUtil.calSum(weight);//计算TFIDF总和
for(Map.Entry<String, Double> me: weight.entrySet()){
String f=me.getKey();
double w=me.getValue()/sum;
tfidf.put(f, w);
}
return MapUtil.descend(tfidf);
}
/**
* 进行标准化,每一个特征除以这篇文本中最大的TFIDF值,构成新的TFIDF集
* @return filePath文件的特征-标准化TFIDF集
*/
public Map<String,Double> getStandardTFIDF(){
Map<String,Double> tfidf=new HashMap<String,Double>();
Map<String,Double> weight=getTFIDF()