TF-IDF算法-golang实现

1、TF-IDF算法介绍

       TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。

       TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

       TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

 

(1)TF是词频(Term Frequency)

        词频(TF)表示词条(关键字)在文本中出现的频率。

        这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。

        公式:           即:

 

        其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;

 

(2) IDF是逆向文件频率(Inverse Document Frequency)

        逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。

如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

        公式:         

        其中,|D| 是语料库中的文件总数。 |{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

        即:

 

 

(3)TF-IDF实际上是:TF * IDF

       某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

       公式:

     

 

 golang 实现TF-IDF 算法

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "math"
 6     "sort"
 7     "time"
 8 )
 9 
10 type wordTfIdf struct {
11     nworld string
12  value float64 13 } 14 15 func main() { 16 start := currentTimeMillis() 17  FeatureSelect(Load()) 18 19 20 cost := currentTimeMillis() - start 21 fmt.Printf("耗时 %d ms ",cost) 22 23 } 24 25 type wordTfIdfs []wordTfIdf 26 type Interface interface { 27  Len() int 28  Less(i, j int) bool 29  Swap(i, j int) 30 } 31 32 func (us wordTfIdfs) Len() int { 33 return len(us) 34 } 35 func (us wordTfIdfs) Less(i, j int) bool { 36 return us[i].value > us[j].value 37 } 38 func (us wordTfIdfs) Swap(i, j int) { 39 us[i], us[j] = us[j], us[i] 40 } 41 42 func currentTimeMillis() int64 { 43 return time.Now().UnixNano() / 1000000 44 } 45 func FeatureSelect(list_words [][]string) { 46 docFrequency := make(map[string]float64, 0) 47 sumWorlds := 0; 48 for _, wordList := range list_words { 49 for _, v := range wordList { 50 docFrequency[v] += 1 51 sumWorlds++; 52  } 53  } 54 wordTf := make(map[string]float64) 55 for k, _ := range docFrequency { 56 wordTf[k] = docFrequency[k] / float64(sumWorlds) 57  } 58 docNum := float64(len(list_words)) 59 wordIdf := make(map[string]float64) 60 wordDoc := make(map[string]float64, 0) 61 for k, _ := range docFrequency { 62 for _, v := range list_words { 63 for _, vs := range v { 64 if (k == vs) { 65 wordDoc[k] += 1 66 break 67  } 68  } 69  } 70  } 71 for k, _ := range docFrequency { 72 wordIdf[k] = math.Log(docNum / (wordDoc[k] + 1)) 73  } 74  var wordifS wordTfIdfs 75 for k, _ := range docFrequency { 76  var wti wordTfIdf 77 wti.nworld = k 78 wti.value = wordTf[k] * wordIdf[k] 79 wordifS = append(wordifS, wti) 80  } 81  sort.Sort(wordifS) 82  fmt.Println(wordifS) 83 } 84 85 func Load() [][]string { 86 slice := [][]string{ 87 {"my", "dog", "has", "flea", "problems", "help", "please"}, 88 {"maybe", "not", "take", "him", "to", "dog", "park", "stupid"}, 89 {"my", "dalmation", "is", "so", "cute", "I", "love", "him"}, 90 {"stop", "posting", "stupid", "worthless", "garbage"}, 91 {"mr", "licks", "ate", "my", "steak", "how", "to", "stop", "him"}, 92 {"quit", "buying", "worthless", "dog", "food", "stupid"}, 93  } 94 return slice 95 }

 

转载于:https://www.cnblogs.com/tianxingxing/p/10758103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: nltk是一个Python自然语言处理库,可以用来实现tf-idf算法tf-idf算法是一种用于文本挖掘和信息检索的常用算法,它可以计算一个词在文本中的重要性。 在nltk中,可以使用TfidfVectorizer类来实现tf-idf算法。首先需要导入nltk和TfidfVectorizer类: ``` import nltk from sklearn.feature_extraction.text import TfidfVectorizer ``` 然后,可以使用TfidfVectorizer类来计算tf-idf值: ``` # 定义文本列表 texts = ["This is a sample text", "Another text sample", "And one more sample text"] # 创建TfidfVectorizer对象 tfidf = TfidfVectorizer() # 计算tf-idf值 tfidf_values = tfidf.fit_transform(texts) # 输出tf-idf值 print(tfidf_values) ``` 输出结果如下: ``` (, 4) .5773502691896257 (, 1) .5773502691896257 (, ) .5773502691896257 (1, 3) .5773502691896257 (1, 2) .5773502691896257 (1, 1) .5773502691896257 (2, 4) .5773502691896257 (2, ) .5773502691896257 (2, 5) .5773502691896257 ``` 其中,每一行表示一个文本的tf-idf值,每一列表示一个词。如果一个词在文本中出现的次数越多,它的tf-idf值就越大。 ### 回答2: TF-IDF算法是一种经典的文本挖掘算法,用于衡量某个词语在文本集中的重要程度。通过计算每个词语的TF(Term Frequency)和IDF(Inverse Document Frequency)值,得出一个词语的重要性权重,从而进行文本分类、关键词提取和相似度计算等任务。 在Python中,nltk是实现TF-IDF算法的常用工具。下面我们来介绍如何使用nltk进行TF-IDF计算: 1. 准备数据集 首先需要准备一个文本数据集,可以是多个文本文件或者一篇长文本。将数据读入Python,并对文本进行分词和处理,得到一个词语列表。 2. 计算TF值 对于每个文本,计算其中每个词语在文本中出现的频率TF。可以使用nltk库中的FreqDist函数,该函数可以计算一个列表中每个元素的出现次数,并按照出现次数从高到低排序。 3. 计算IDF值 对于所有文本,计算每个词语在文本集中出现的文档频率IDF。IDF值反映了一个词语在文本集中的普遍重要程度,如果一个词语在多数文本中都出现,则IDF值较低,反之则较高。 计算IDF值可以使用nltk库中的TextCollection函数,该函数可以把所有文本的词语列表传入,并计算每个词语的IDF值。 4. 计算TF-IDF值 将每个词语在每个文本中的TF值和在文本集中的IDF值相乘,得到TF-IDF值。可以使用Python中的pandas库将TF和IDF值整合到一个数据框中,方便计算。 5. 应用TF-IDF算法 计算得到TF-IDF值后,可以应用到各种文本挖掘任务中。例如: - 文本分类:将每个文本的TF-IDF向量作为输入,使用机器学习算法(如支持向量机)对文本进行分类。 - 关键词提取:选取每个文本中TF-IDF值最高的几个词语作为关键词。 - 相似度计算:将每个文本的TF-IDF向量作为输入,计算各文本之间的余弦相似度,从而判断它们之间的相似程度。 总之,nltk是一款强大的文本挖掘工具,能够轻松实现TF-IDF算法以及其他文本处理任务。我们可以使用其提供的函数和方法快速地进行数据处理和分析,从而得到更多有意义的信息。 ### 回答3: TF-IDF算法是一种被广泛应用的文本挖掘算法,在自然语言处理领域中有着广泛的应用。Python中的自然语言处理工具包NLTK可以实现TF-IDF算法,下面将具体介绍。 首先需要导入NLTK和其依赖包: ``` import nltk import string from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import PorterStemmer from nltk.stem import WordNetLemmatizer from collections import Counter import math ``` 接下来,可以创建一个处理器类来进行数据的预处理,如下: ``` class Processor: def __init__(self): self.stop_words = set(stopwords.words('english')) self.punctuations = set(string.punctuation) self.stemmer = PorterStemmer() self.lemmatizer = WordNetLemmatizer() def process(self, text): tokens = word_tokenize(text.lower()) filtered_tokens = [self.stemmer.stem(self.lemmatizer.lemmatize(token)) for token in tokens if not token in self.stop_words and not token in self.punctuations] return filtered_tokens ``` 这里使用了一些常用的数据预处理方法,如过滤停用词、过滤标点符号、词根提取和词形还原等。 接下来,可以实现TF-IDF算法的主要部分。具体步骤如下: 1. 进行数据预处理; 2. 统计每个词在每个文档中出现的次数,得到词频矩阵; 3. 对于每个文档,计算每个单词的TF值; 4. 统计每个单词在多少个文档中出现过,得到逆文档频率(IDF); 5. 对于每个文档,计算每个单词的TF-IDF值。 具体代码实现如下: ``` class TFIDF: def __init__(self, docs): self.docs = docs self.D = len(docs) self.processor = Processor() def term_frequency(self, term, doc): return doc.count(term) / len(doc) def inverse_document_frequency(self, term): n = sum(1 for doc in self.docs if term in doc) return math.log(self.D / n) def tf_idf(self, term, doc): tf = self.term_frequency(term, doc) idf = self.inverse_document_frequency(term) return tf * idf def tf_idf_doc(self, doc): tf_idf_dict = {} tokens = self.processor.process(doc) counter = Counter(tokens) for token in np.unique(tokens): tf_idf_dict[token] = self.tf_idf(token, tokens) return tf_idf_dict def tf_idf_corpus(self): tf_idf_corpus = [] for doc in self.docs: tf_idf_dict = self.tf_idf_doc(doc) tf_idf_corpus.append(tf_idf_dict) return tf_idf_corpus ``` 其中,term_frequency用于计算TF值,inverse_document_frequency用于计算IDF值,tf_idf用于计算TF-IDF值,tf_idf_doc用于计算单篇文档的TF-IDF值。最后,可以在实例化TFIDF类后,调用tf_idf_corpus方法,得到整个语料库的TF-IDF矩阵。 这样,就可以使用NLTK实现TF-IDF算法啦!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值