package com.sap.research.semantic;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.print.attribute.standard.OutputDeviceAssigned;
import cc.mallet.types.Vector;
import cc.mallet.util.CommandOption.Set;
import com.sap.research.util.Pair;
public class SemanticInterpretor {
private InvertedIndex invertedIndex;
public SemanticInterpretor(InvertedIndex invertedIndex) {
this.invertedIndex = invertedIndex;
}
// vector representation for a document based on concepts in DB
public HashMap<String, Double> vectorRepreforDoc(File file) {
HashMap<String, Pair<String, Integer>> docVec = invertedIndex
.termCount(file);
// vector representation for a document, only term frequency considered
// HashMap<term, frequency>
HashMap<String, Integer> vec = new HashMap<String, Integer>();
for (Map.Entry<String, Pair<String, Integer>> entry : docVec.entrySet()) {
vec.put(entry.getKey(), entry.getValue().second);
}
// semantical vector representation for a document
// HashMap<concept, relatedness>
HashMap<String, Double> semanticVec = new HashMap<String, Double>();
// vector representation based on concepts
HashMap<String, ArrayList<Pair<String, Double>>> indices = invertedIndex
.getInvertedIndicesDouble();
for (Map.Entry<String, Integer> entry : vec.entrySet()) {
if (indices.keySet().contains(entry.getKey())) {
// if certain word is contained in the invertedIndex
ArrayList<Pair<String, Double>> pairList = indices.get(entry
.getKey());
for (Pair<String, Double> pair : pairList) {
double relatedness = entry.getValue() * pair.second;
if (!semanticVec.keySet().contains(pair.first)) {
semanticVec.put(pair.first, relatedness);
} else {
semanticVec.put(pair.first, semanticVec.get(pair.first)
+ relatedness);
}
}
} else {
// if certain word is not contained in the invertedIndex
// simply ignore?
}
}
output(semanticVec);
return semanticVec;
}
private void output(HashMap<String, Double> semanticVec) {
System.out.println(semanticVec);
}
public double semanticalSimilarity(HashMap<String, Double> docVec1,
HashMap<String, Double> docVec2) {
ArrayList<String> base = new ArrayList<String>();
for (Map.Entry<String, Double> entry : docVec1.entrySet()) {
base.add(entry.getKey());
}
for (Map.Entry<String, Double> entry : docVec2.entrySet()) {
if (!base.contains(entry.getKey())) {
base.add(entry.getKey());
}
}
HashMap<String, Double> docVec1Std = new HashMap<String, Double>();
ArrayList<Double> docVec1Double = new ArrayList<Double>();
HashMap<String, Double> docVec2Std = new HashMap<String, Double>();
ArrayList<Double> docVec2Double = new ArrayList<Double>();
for (String string : base) {
if (docVec1.keySet().contains(string)) {
docVec1Std.put(string, docVec1.get(string));
docVec1Double.add(docVec1.get(string));
} else {
docVec1Std.put(string, 0.0);
docVec1Double.add(0.0);
}
if (docVec2.keySet().contains(string)) {
docVec2Std.put(string, docVec2.get(string));
docVec2Double.add(docVec2.get(string));
} else {
docVec2Std.put(string, 0.0);
docVec2Double.add(0.0);
}
}
output(docVec1Std);
output(docVec2Std);
double similarity = 0.0;
if (docVec1Double.size() == docVec2Double.size()) {
double prod = 0.0;
double doc1Sqr = 0.0;
double doc2Sqr = 0.0;
for (int i = 0; i < docVec1Double.size(); i++) {
prod += docVec1Double.get(i) * docVec2Double.get(i);
doc1Sqr += docVec1Double.get(i) * docVec1Double.get(i);
doc2Sqr += docVec2Double.get(i) * docVec2Double.get(i);
}
similarity = prod / (Math.sqrt(doc1Sqr) * Math.sqrt(doc2Sqr));
} else {
System.err.println("cannot compare vectors of different length!");
}
return similarity;
}
public double computeSemanticRelatedness(File fileA, File fileB) {
// invertedIndex.addIndices(dirPath, filePath, recursive)
return semanticalSimilarity(vectorRepreforDoc(fileA),
vectorRepreforDoc(fileB));
}
public static void main(String[] args) {
String propertyFilePath = "settings/html.properties";
InvertedIndex invertedIndex = new InvertedIndex(propertyFilePath);
invertedIndex.addIndices("test/input/html_20", "html", true);
SemanticInterpretor interpretor = new SemanticInterpretor(invertedIndex);
File fileA = new File("test/input/html/topic1.html");
File fileB = new File("test/input/html/topic2.html");
double similarity = interpretor
.computeSemanticRelatedness(fileA, fileB);
System.out.println("Semantic relatedness of " + fileA.getName()
+ " and " + fileB.getName() + " is: " + similarity);
}
}
分享到:
相关推荐
TF-IDF与余弦相似性的应用 TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用的关键词提取算法,应用于自动关键词提取、信息检索等领域。该算法的优点是简单快速,结果比较符合实际情况。TF-IDF 算法...
《LDA与TF-IDF算法:深度探讨与应用》 在信息检索和自然语言处理领域,LDA(Latent Dirichlet Allocation)和TF-IDF(Term Frequency-Inverse Document Frequency)是两种至关重要的算法,它们在文本分析、文档分类...
### 使用TF-IDF确定文档查询中的词相关性 在当今数据驱动的世界中,从大量文本信息中高效地检索相关信息是一项至关重要的技能。本文探讨了如何应用TF-IDF(Term Frequency-Inverse Document Frequency)来确定文档...
2. **逆文档频率(Inverse Document Frequency, IDF)**: IDF是通过计算包含特定词的文档数量的倒数来降低常见词汇的权重。公式为IDF(w) = log(N/df(w)),其中N是总文档数,df(w)是包含词w的文档数。如果一个词在很多...
在这个主题中,"NLP:基于TF-IDF的中文关键词提取"是一个项目,它利用TF-IDF算法来从中文文本中提取具有代表性的关键词。TF-IDF是一种经典的文本特征权重计算方法,广泛应用于信息检索、文档分类和关键词提取等领域...
### 基于TF-IDF算法抽取文章关键词 #### 一、引言 TF-IDF(Term Frequency-Inverse Document Frequency)是一种广泛应用于信息检索与文本挖掘领域的统计方法,用于评估单词对于一个文档集或者语料库中单个文档的...
在"tf-idf-keyword-master"这个压缩包文件中,很可能包含了实现TF-IDF关键词提取的代码框架或者示例。用户可能需要进一步了解代码结构,学习如何加载特定语料库,如何进行预处理,如何计算TF-IDF值,以及如何输出和...
2. **逆文档频率(Inverse Document Frequency, IDF)**:IDF用来衡量一个词的普遍性,即这个词在多少文档中出现。如果一个词在很多文档中都出现,那么它的IDF值较低,因为它不太能区分文档;反之,如果只在少数文档中...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和自然语言处理中广泛使用的统计方法,用于评估一个词在文档集合中的重要性。在Java编程环境下,TF-IDF可以帮助我们提取文本的关键信息,理解...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和自然语言处理中广泛使用的文本特征表示方法。它能够衡量一个词在文档中的重要性,适用于文档集合的特征提取,帮助我们理解文档的主题和区分...
基于 TF-IDF 文本向量化的 SQL 注入攻击检测 SQL 注入攻击是最常见的 Web 应用程序攻击手段,利用机器学习检测 SQL 注入攻击已成为一种趋势。该论文提出了基于 TF-IDF 文本向量化的 SQL 注入攻击检测方法,旨在提高...
TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索和文本挖掘领域广泛使用的权重计算方法,用于评估一个词在文档中的重要性。这个概念基于两个原则:词频(Term Frequency, TF)和逆文档频率...
2. **逆文档频率(Inverse Document Frequency, IDF)**:反映了一个词在整个文档集合中的稀有程度。IDF是所有文档数除以包含该词的文档数,再取对数。如果一个词在很多文档中都出现,其IDF值会较低;反之,如果只在...
2. **搜索引擎排名**:搜索引擎会利用TF-IDF来决定搜索结果的相关性,高TF-IDF值的词更可能与查询相关。 3. **信息检索**:在海量文档中查找相关信息时,TF-IDF有助于找出最相关的文档。 4. **文本摘要**:通过识别...
2. 将改进的TF-IDF算法应用于牛疾病诊断系统中,提高了疾病诊断的准确率和可信度。 3. 证明了改进的TF-IDF算法在疾病诊断领域中的应用价值和前景。 本文的研究结果对智能诊断系统和疾病诊断领域具有重要的贡献和...
TF-IDF算法,即词频-逆文档频率(Term Frequency-Inverse Document Frequency)算法,是关键词提取中最常用的方法之一。该算法综合了词频(TF)和逆文档频率(IDF)两个因子来评估词汇在文档集合中的重要性。 在...
2. **文本分类和聚类**:TF-IDF可以作为特征向量,用于区分不同类别的文本,帮助实现文本分类和聚类。 3. **关键词提取**:通过计算TF-IDF值,可以找出文档中的重要关键词,有助于摘要生成和文档理解。 4. **推荐...
2. **创建词汇表**:使用`TfidfVectorizer`构建词汇表,转换文本数据为TF-IDF向量。 3. **训练模型**:使用`sklearn.naive_bayes.GaussianNB`(或其他类型的朴素贝叶斯分类器)训练模型,输入是TF-IDF向量,输出是...
2. 计算词频(Term Frequency, TF):统计每个词在文档中出现的次数。 3. 计算逆文档频率(Inverse Document Frequency, IDF):估算词的普遍性,反比于包含该词的文档数量。 4. 计算TF-IDF值:将词频与逆文档频率...