信息检索的历史发展过程中,出现了很多的模型,模型就是实际问题的抽象。如布尔模型、向量模型。
布尔模型以集合的布尔运算为基础,查询效率高,但只能适用简单搜索问题,同时还要求用户要按照要求拼凑查询串,只能用于特定领域。
向量模型把查询串和文档都是为词所构成的多维向量,查询与文档的相关性用向量间的夹角来表示。向量计算不适用于大规模数据。
TF-IDF(Term Frequency Inverse Doucument Frequency)模型,中文意思是:词频-逆文档频率。
TF-IDF核心思想是“给定的查询串q和文档d的匹配度问题”,这个在搜索引擎中使用广泛。
TF(Term Frequency),即词频,一个词q在文中出现的次数(tf = len(q)/len(all)),一般来说,一个词在一篇文章中出现的次数越多,则这篇文章的意思就越有可能与这个词相关,但是有些词,如“的”、“是”,在文中出现的次数一般都很高,但都没有实际的意义。所以,词频可以衡量一个词与文的相关性,但不能只用它。
IDF(Inverse Doucument Frequency),逆文档频率,即文档总数n与词q所出现文件数n1的比值的对数log(n/n1)。其思想是:词q如果在某篇文章中出现,而在其他文章中很少出现,则q具有很好的区分性,能大致代表出现较多的那篇文章。
最后TF-IDF的值就是:tf*idf,用来表示查询串与文档d的匹配度。这个匹配度,可以从概率的角度来理解,即用户通过查询串q,期望获得文档d的概率。在结果展示中,按从大到小的顺序排列即可,当然,实际中可能还有更多的问题要考虑。
下面是我用Java的实现:
package cn.zhf.cluster;
import java.io.*;
import java.util.*;
import org.junit.Test;
/**
* tf-idf实现类
* 如果是中文,其中input中的txt文件需要先用空格分好词
* 此类只是简单实现,还有很多问题
* @author zhaohuafei
*
*/
public class TFIDF {
public static final String FILE = "E:/input2/input2.txt";// 单个文件地址
public static final String FILES = "E:/input2/";// 文档所在目录
/**
* Term Frequency - Inverse Document Frequency 给定串在给定文件列表中某一文件的 逆文档频率
*
* @param term
* @param file
* @param files
* @return
*/
public double tfidf(String term, File file, File[] files) {
int tf = tf(term, file);
double idf = idf(term, files);
return tf * idf;
}
/**
* Term Frequency of a term(word) in a file
*
* @param term
* @param file
* @return
*/
public int tf(String term, File file) {
if (tfmap(file).get(term) == null)
return 0;
return tfmap(file).get(term);
}
/**
* Inverse Document Frequency the number of documents that a term appears
*
* @param term
* @list the documents that this term appears
* @return
*/
public double idf(String term, File[] files) {
List<Map<String, String>> list = idfmap(files);
int count = 0;// term出现的文件数
for (int i = 0; i < list.size(); i++) {
Map<String, String> map = list.get(i);
for (Map.Entry<String, String> m : map.entrySet()) {
if (m.getValue().equals(term))
count++;
}
}
return Math.log(files.length / count);
}
/**
* All Term Frequency Map in a file
*
* @param file
* @return
*/
public Map<String, Integer> tfmap(File file) {
Map<String, Integer> map = new HashMap<String, Integer>();
List<String> list = segment(file);
for (String term : list)
map.put(term, !map.containsKey(term) ? 1 : map.get(term) + 1);
return map;
}
/**
* All Inverse Document Frequency as a map
*
* @param files
* @return map<filename,term>
*/
public List<Map<String, String>> idfmap(File[] files) {
Map<String, Integer> maptf = new HashMap<String, Integer>();
List<Map<String, String>> list = new LinkedList<Map<String, String>>();
for (int i = 0; i < files.length; i++) {
maptf = tfmap(files[i]);
for (Map.Entry<String, Integer> m : maptf.entrySet()) {
String key = m.getKey();
Map<String, String> map = new HashMap<String, String>();
map.put(files[i].getName(), key);
list.add(map);
}
}
return list;
}
/**检索方法
* 返回(文档名,tfidf值)
*
* @param query
* 查询串
* @return <文档名,tfidf值>,按tfidf值排序
*/
public Map<String, Double> search(String query, File[] files) {
Map<String, Double> map = new HashMap<String, Double>();
for (int i = 0; i < files.length; i++) {
int tf = tf(query, files[i]);
if (tf == 0)
continue;
double idf = idf(query, files);
double tfidf = tf * idf;
map.put(files[i].getName(), tfidf);
}
map = sortMapByValueAsc(map);
return map;
}
/**
* map按值排序 asc
*
* @param map
* @return
*/
public static <K, V extends Comparable<? super V>> Map<K, V> sortMapByValueAsc(
Map<K, V> map) {
List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(
map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
return (o2.getValue()).compareTo(o1.getValue());
}
});
Map<K, V> ret = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> m : list) {
ret.put(m.getKey(), m.getValue());
}
return ret;
}
/**
* 简单的分词,假设句子都是以空格隔开的 TODO
*
* @param file
* @return
*/
public List<String> segment(File file) {
List<String> list = new ArrayList<String>();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file), "gbk"));
String tmp = null, str = null;
while ((str = br.readLine()) != null) {
tmp += str;
}
String[] s = tmp.split("\\s");
for (int i = 0; i < s.length; i++)
list.add(s[i].trim());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
// 以下均为测试
@Test
public void test3() {
int tf = tf("的", new File(FILE));
System.out.println("TF = " + tf);
Map<String, Double> map = search("的", new File(FILES).listFiles());
for (Map.Entry<String, Double> m : map.entrySet()) {
System.out.println(m.getKey() + "-->" + m.getValue());
}
}
public void test2() {
File file = new File(FILES);
File[] files = file.listFiles();
List<Map<String, String>> list = idfmap(files);
for (int i = 0; i < list.size(); i++) {
Map<String, String> map = list.get(i);
for (Map.Entry<String, String> m : map.entrySet()) {
System.out.println(m.getKey() + "-->" + m.getValue());
}
}
double tfidf = tfidf("的", new File(FILE), new File(FILES).listFiles());
System.out.println("count = " + tfidf);
}
public void test1() {
File file = new File(FILE);
List<String> list = segment(file);
for (String str : list)
System.out.println(str);
}
public void test() {
File file = new File(FILES);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
Map<String, Integer> map = tfmap(files[i]);
for (Map.Entry<String, Integer> m : map.entrySet()) {
System.out.println(m.getKey() + "-->" + m.getValue());
}
}
}
}
分享到:
相关推荐
TF-IDF(term frequency –inverse document frequency)频率—反文档频率,是一种用于咨询检索与咨询探勘的常用加权技术。TF_IDF是一种统计方法,用以评估一字词对于一个文件集成或一个语料库中的其中一份文件的...
BERTopic是一种利用主题建模技术 :hugging_face: 转换程序和c-TF-IDF创建密集的群集,使主题易于理解,同时在主题描述中保留重要字词。 它甚至支持类似于LDAvis的可视化! 相应的媒体帖子可以在找到。 安装 可以...
我们将使用两种文本预处理技术Stemming和Lemmatization以及Word of Bag和TF-IDF模型来创建SMS垃圾邮件分类器模型。 定义: 词干:这是将单词转换为词根形式的过程。 词法化:与词干法不同,词法化将单词还原为该...
该研讨会资料使用 ,这是一种使用TF-IDF(术语频率-逆文档频率)估计器的代码发现服务。 我们旨在索引*.yaml和*.py文件中的代码(内容)。 然后使用用户查询与索引代码进行比较。 内容-ipython笔记本 处理Python...
通过使用TF-IDF和余弦相似度的概念,我们构建了此推荐引擎。 数据 对于此项目,我们正在使用。 此数据集包含来自户外服装品牌产品目录的500个实际SKU的数据。 依赖关系和安装 我们需要以下依赖关系。 熊猫: sudo ...
Yelp评论评级预测概括该项目的目的是使用评论文字来预测Yelp上的评论星级。 我们构建了以下模型,这些模型对评论数据进行文本分析以预测星级。 基准模型:最普遍的评级为3星,是该模型针对所有评论所预测的评级。...
NLP日语食谱 该存储库包含用于日语自然语言处理的示例代码。...TF-IDF和Logistic回归,TF-IDF和LightGBM,BERT,T5 日语文字可视化 环境 docker-compose up -d --build docker exec -it nlp-recipes-ja bash
更新02/02/2021:添加了基于BERT的分类器,并使用了Bigrams进行了实验(无明显改进) 更新02/03/2021:修订的BERT(使用的带库的磁带库)(准确度略有提高,达到62.069%) 要做的事情:添加句子长度功能并将其合并...
电影推荐系统使用两种不同的方法实现: 基于内容:使用TF-IDF矢量化器的余弦相似度协同过滤:具有期望最大化的高斯混合模型 资料夹 代码:包含使用上述方法的jupyter笔记本-> ContentBasedRefined.ipynb(使用scikit...
它会建立一个由ng-grams分配的TF-IDF分数的文档术语矩阵。 然后,它使用矩阵乘法来计算这些值之间的余弦相似度。 如何使用? 该项目有一个python3笔记本作为源代码。 Dependencies: - pandas - scikit-learn -...
python脚本+笔记本使用字数统计或tfidf可视化热门关键字笔记本如何正确使用Word2Vec以获得所需的结果python脚本如何使用PySpark读取带有字数示例的不同格式的文件笔记本如何使用TF-IDF和Python的SKLEARN从文本中提取...
使用 Java 和 Neo4j 提取和学习特征,并通过在加权 tf-idf 特征向量上构建逻辑回归分类器进行评估。 在线查看笔记本 笔记本的内容可以通过 nbviewer.ipython.org 在线查看。 安装 Python 对于笔记本的真正交互式...
SummerBusinessAnalystProject 这是我在2020年暑期实习期间所做的一些工作。档案文件GiannaManiaci_2020SummerIntern_Presentation [6503] .pptx ... 用户可以选择4种矢量化数据表示方法,BoW,TF-IDF,LDA或Doc2Vec
TF-IDF Word2Vec 标准定标器 归一化器 编码分类 主成分分析 #数据可视化返回顶部 Matplotlib / Seaborn [ 笔记本] 情节.ly d3.js #数据采集返回顶部 请求 - 网页抓取 机械化 - 网页抓取 BeautifulSoup - HTML
前面已经讲过了隐马尔可夫模型、感知机、条件随机场、朴素贝叶斯模型、支持向量机等传统机器学习模型,同时,为了将这些机器学习模型应用于 NLP,我们掌握了特征模板、TF-IDF、词袋向量等特征提取方法。而这些方法的...
TF-IDF [sklearn] 通用句子编码器(TensorFlow Hub)[ ] 超参数调整 随机搜寻 第5队:劳拉·萨拉萨尔·拉米雷斯(Laura SalazarRamírez)-威廉·冈萨雷斯·麦地那(WilmarGonzálezMedina)-约翰·洛佩兹·奇...
奖励:在节点的“自然”包中做一些 TF-IDF NLP(但需要注意):——臭名昭著的50 Shades Sex Scene Detection,因为垃圾邮件很无聊- 非常快速地介绍 Python 中的主要 ML 包,用于比较目的; 同性场景数据。 [Intro ...
first-nlp:预处理,正则表达式,lemmatization,countvectorizing和tf-idf nmf:基于计数向量语料库将评论集群创建为主题 coffee_ratings_models:基于得分和nlp的线性和随机森林回归以确定咖啡的总体评级 可视化...
内容在笔记本文件夹中,您将找到: 抓取:漂亮的汤和我的.py文件可从CoffeeReview.com刮取咖啡评论first-nlp:预处理,正则表达式,lemmatization,countvectorizing和tf-idf nmf:基于计数向量语料库将评论集群创建...
我使用的模型包括:在TF-IDF上: 朴素贝叶斯 K最近邻居分类器 随机森林 支持向量机 逻辑回归 堆叠分类器:无法实施。 关于嵌入: LSTM 对于每种模型,我都提供了详细的使用说明,并根据研究结果对结果进行了...