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 }
TF-IDF算法-golang实现的更多相关文章
- tf–idf算法解释及其python代码实现(下)
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- tf–idf算法解释及其python代码实现(上)
tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...
- 55.TF/IDF算法
主要知识点: TF/IDF算法介绍 查看es计算_source的过程及各词条的分数 查看一个document是如何被匹配到的 一.算法介绍 relevance score算法,简单来说 ...
- Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据
相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...
- tf–idf算法解释及其python代码
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- 25.TF&IDF算法以及向量空间模型算法
主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean mo ...
- Elasticsearch学习之相关度评分TF&IDF
relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...
- 基于TF/IDF的聚类算法原理
一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...
- 信息检索中的TF/IDF概念与算法的解释
https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...
随机推荐
- 配置方法数超过 64K 的应用
随着 Android 平台的持续成长,Android 应用的大小也在增加.当您的应用及其引用的库达到特定大小时,您会遇到构建错误,指明您的应用已达到 Android 应用构建架构的极限.早期版本的构建 ...
- Linux CentOS 6.5 + Apache + Mariadb + PHP环境搭建
Web自动化测试-服务端测试环境部署 by:授客 目录 一. 二. 三. 四. 五. 六. 七. 八. 九. 十. 操作系统环境:CentOS 6.5-x86_64 下载地址:http://www.c ...
- flutter tab切换页面防止重置
问题描述:TabBar 配合TabBarView切换页面,然后每个页面是一个listview加载数据,但是切换页面后listview的数据会被重置, 重新被加载了,解决办法使用 with Automa ...
- Android系统启动流程(四)Launcher启动过程与系统启动流程
此前的文章我们学习了init进程.Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇 ...
- windows下react-native android环境搭建注意事项
1.使用了genymotion建立模拟器(新增时模拟器时记得选网络,如下图) 与android stuido搭配使用教程:http://jingyan.baidu.com/article/915fc4 ...
- jquery中ajax的dataType的各种属性含义
参考ajax api文档:http://www.w3school.com.cn/jquery/ajax_ajax.asp dateType后接受的参数参数类型:string 预期服务器返回的数据类型. ...
- Oracle EBS OPM 生产批创建事务处理
--生产批创建事物处理 --created by jenrry DECLARE p_mmti_rec mtl_transactions_interface%ROWTYPE; p_mmli_tbl gm ...
- 将sqllite3数据库迁移到mysql
一.安装python mysql module (OneDrive): 1.运行python D:\OneDrive\Work\django\mysqlregistry.py2.http://www. ...
- 怎样使用 virt-viewer 远程访问 qemu 虚拟机 - 转载
How to connect to a VM hosted on QEMU remotely using virt-viewer I couldn’t find comprehensive artic ...
- php框架安装
安装yii框架 跳转到composer.phar目录 cd C:\ProgramData\ComposerSetup\bin 安装yii2高级版 php composer.phar create-pr ...