文本分词与TF-IDF

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.lang.Math;;
public class func2 {
    public static void main(String[] args) throws Exception {
        //读取文档内容
        char[] c2=new char[1000];
        FileReader fr2=new FileReader("C://Users//Administrator//Desktop//作业1//文本分类.txt");
        int num2=fr2.read(c2);
        String text=new String(c2,0,num2);
        text=text.toLowerCase();
        //将文档内容按行存入数组
        String[] str0=new String[1000];
        str0=text.split("\n");
        //设置分词器对象及分词方式
        System.out.println("…………正在分词…………");
        IKAnalyzer analyzer = new IKAnalyzer();
        analyzer.setUseSmart(true);
        int i,j;
        fr2.close();
        //对每一行执行分词操作并覆盖原行
        for(i=0;i<str0.length;i++)
            str0[i]=AnalysisResult(analyzer,str0[i]);
        //输出分词结果并将分词结果存入二维数组
        String[][] str=new String[13][];
        for(i=0;i<str0.length;i++){
            System.out.println(str0[i]);
            str[i]=str0[i].split(" ");
        }
        //计算TF-IDF
        System.out.println("…………正在计算TF-IDF…………");
        func1 obj=new func1();
        int[][] tf=new int[13][];
        int[][] include=new int[13][];
        double[][] idf=new double[13][];
        double[][] tfidf=new double[13][];
        for(i=0;i<str.length;i++){
            for(j=0;j<str[i].length;j++){
                //计算词频(TF)
                tf[i]=new int[str[i].length];
                tf[i][j]=obj.count(text,str[i][j]);
                //计算逆文档频率(IDF)
                include[i]=new int[str[i].length];
                include[i][j]=CountInclude(str0,str[i][j]);
                idf[i]=new double[str[i].length];
                idf[i][j]=Math.log10(13.0/include[i][j]);
                //计算TF-IDF
                tfidf[i]=new double[str[i].length];
                tfidf[i][j]=tf[i][j]*idf[i][j];
        System.out.print(str[i][j]+":"+String.format("%.4f",tfidf[i][j])+"\t");
            }
            System.out.print("\n");
        }   
    }
    public static String AnalysisResult(Analyzer analyzer, String keyWord)
            throws Exception {
        char[] c=new char[1000];
        String str="";
        TokenStream tokenStream = analyzer.tokenStream("content",
                new StringReader(keyWord));
        tokenStream.addAttribute(CharTermAttribute.class);
        while (tokenStream.incrementToken()) {
            CharTermAttribute charTermAttribute = tokenStream
                    .getAttribute(CharTermAttribute.class);
            str+=(charTermAttribute.toString()+" ");
        }
        return str; 
    }
    public static int CountInclude(String[] s,String word){
        int num=0,i;
        for(i=0;i<s.length;i++){
            if(s[i].indexOf(word)>=0){
                num++;
                continue;
            }else continue;
        }
        return num; 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文文本进行TF-IDF的步骤如下[^1][^2]: 1. 分词:将中文文本分割成词语的序列。可以使用jieba等中文分词工具进行分词。 2. 计算词频(TF):统计每个词语在文本中出现的频率。可以使用字典或者Counter对象来记录词语的频率。 3. 计算逆文档频率(IDF):计算每个词语在整个文本集中的重要性。可以使用以下公式计算IDF: IDF(t) = log(N / (df(t) + 1)) 其中,N是文本集中的文档总数,df(t)是包含词语t的文档数。 4. 计算TF-IDF:将词频和逆文档频率相乘,得到每个词语的TF-IDF值。可以使用以下公式计算TF-IDFTF-IDF(t) = TF(t) * IDF(t) 5. 可选步骤:根据需要进行进一步的改进。例如,可以使用TF-IDF-CI来改进TF-IDF的性能。TF-IDF-CI考虑了词语在整个文本集中的分布情况,进一步提高了关键词的准确性。 以下是一个示例代码,演示如何使用Python进行中文文本TF-IDF计算: ```python import jieba from collections import Counter import math def calculate_tf_idf(texts): # 分词 words_list = [list(jieba.cut(text)) for text in texts] # 计算词频 word_counts = [Counter(words) for words in words_list] # 计算逆文档频率 doc_count = len(texts) idf = {} for word_count in word_counts: for word, count in word_count.items(): if word not in idf: idf[word] = 0 idf[word] += 1 for word, count in idf.items(): idf[word] = math.log(doc_count / (count + 1)) # 计算TF-IDF tf_idf_list = [] for word_count in word_counts: tf_idf = {} for word, count in word_count.items(): tf_idf[word] = count * idf[word] tf_idf_list.append(tf_idf) return tf_idf_list # 示例文本 texts = [ "这是一个示例文本", "这是另一个示例文本", "这是第三个示例文本" ] # 计算TF-IDF tf_idf_list = calculate_tf_idf(texts) # 打印结果 for i, tf_idf in enumerate(tf_idf_list): print(f"文本{i+1}的TF-IDF值:") for word, value in tf_idf.items(): print(f"{word}: {value}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值