这是我计算文档集合中文档的TF-IDF值的程序.这工作正常,但在计算"IDF"值(查找包含特定术语的文档的数量)时需要花费大量时间.
是否有更有效的方法来查找包含特定术语的文档?
freq = termsFreq.getTermFrequencies();
terms = termsFreq.getTerms();
int noOfTerms = terms.length;
score = new float[noOfTerms];
DefaultSimilarity simi = new DefaultSimilarity();
for (i = 0; i < noOfTerms; i++) {
int noofDocsContainTerm = noOfDocsContainTerm(terms[i]);
float tf = simi.tf(freq[i]);
float idf = simi.idf(noofDocsContainTerm, noOfDocs);
score[i] = tf * idf ;
}
Run Code Online (Sandbox Code Playgroud)
////
public int noOfDocsContainTerm(String querystr) throws CorruptIndexException, IOException, ParseException{
QueryParser qp=new QueryParser(Version.LUCENE_35, "docuemnt", new StandardAnalyzer(Version.LUCENE_35));
Query q=qp.parse(querystr);
int hitsPerPage = docNames.length; //minumum number or search results
IndexSearcher searcher = new …Run Code Online (Sandbox Code Playgroud) 我\xe2\x80\x99m 通过在索引时指定 TermVector 来使用 Lucene 索引文档集合。\n然后,我通过读取索引并计算每个文档的 TF-IDF 得分向量来检索术语及其频率。然后,使用 TF-IDF 向量,使用维基百科的余弦相似度方程计算文档之间的成对余弦相似度。
\n\n这是我的问题:假设我在这个集合中有两个相同的文档 \xe2\x80\x9cA\xe2\x80\x9d 和 \xe2\x80\x9cB\xe2\x80\x9d (A 和 B 有超过 200 个句子)。如果我计算 A 和 B 之间的成对余弦相似度,它会给出余弦值=1,这是完全可以的。但是,如果我从 Doc \xe2\x80\x9cB\xe2\x80\x9d 中删除单个句子,它会给出这两个文档之间的余弦相似度值约为 0.85。这些文档几乎相似,但余弦值却不同。我知道问题出在 I\xe2\x80\x99m 使用的方程上。
\n\n有没有更好的方法/方程可以用来计算文档之间的余弦相似度?
\n\n已编辑
\n\n这就是我计算余弦相似度的方法,doc1[]并且doc2[]是相应文档的 TF-IDF 向量。向量仅包含scores但不包含words
private double cosineSimBetweenTwoDocs(float doc1[], float doc2[]) {\n double temp;\n int doc1Len = doc1.length;\n int doc2Len = doc2.length;\n float numerator = 0;\n float temSumDoc1 = 0;\n float temSumDoc2 = 0;\n double equlideanNormOfDoc1 …Run Code Online (Sandbox Code Playgroud) 我有一套财务文件(固定条款存款文件,信用卡文件).我想在这些文件中自动识别和标记金融实体/工具.
例如,如果文件中包含此短语,则"保留以利息偿还的权利,恕不另行通知".我想识别与之相关的财务条款,并用它标记,因为这句话是"可调用的".对于这个短语"允许提前提款",相关的财务条款是"可投放的",所以如果这个短语在文件中,我想用术语"Putable"标记它.
财务条款将来自金融业商业本体论.有没有可能为此目的使用斯坦福解析器?我可以将POS标签用于此目的吗?我可能需要用金融工具培训斯坦福大学的解析器,如果有可能我可以如何培训斯坦福大学的解析器来识别金融工具?