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+朴素贝叶斯文本数据的分类与分析源码(高分大作业).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够...
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)和逆文档频率...
TF-IDF算法是一种在文本分析和信息检索领域广泛应用的关键字提取技术。它的主要目标是评估一个词对于一个文档集合或语料库中的某一个文档的重要性。TF-IDF算法结合了词频(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. **推荐...