当前位置: 首页 > 知识库问答 >
问题:

使用Lucene 4.0为单词添加词干并创建不带停止词的索引

皇甫礼骞
2023-03-14

我有以下问题:有几个文本文档需要解析和创建索引,但没有停止词和词干。我可以手动操作,但我从一位同事那里听说Lucene可以自动操作。我在网上搜索了很多我尝试过的例子,但是每个例子都使用了不同版本的lucene和不同的方法,没有一个例子是完整的。在这个过程结束时,我需要计算集合中每个术语的tf/idf。

更新:我现在已经用一个文档创建了一个索引。doc没有停止词,并且有词干。如何使用lucenc计算此文档的tf/idf?(我将在计算出如何进行计算后添加更多文档)

对lucene的任何帮助都将不胜感激。谢谢

import java.io.*;
    import java.util.HashSet;
    import org.apache.lucene.analysis.*;
    import org.apache.lucene.analysis.tokenattributes.*;
    import org.apache.lucene.analysis.standard.*;
    import org.apache.lucene.store.Directory;
    import org.apache.lucene.store.FSDirectory;
    import org.apache.lucene.util.*;
    import org.apache.lucene.analysis.snowball.*;
    import org.apache.lucene.document.Document;
    import org.apache.lucene.document.Field;
    import org.apache.lucene.index.IndexWriter;


public class Stemmer
{
    static HashSet<String> stopWordsList = null;

    public static String Stem(String text, String language) throws IOException
    {
        parse p = new parse();
        stopWordsList = p.readStopWordsFile();
        StringBuffer result = new StringBuffer();
        if (text!=null && text.trim().length()>0)
        {
            StringReader tReader = new StringReader(text);
            // Analyzer analyzer = new StopAnalyzer(Version.LUCENE_36,stopWordsList);
            @SuppressWarnings("deprecation")
            Analyzer analyzer = new SnowballAnalyzer(Version.LUCENE_35,"English",stopWordsList);
            // disk index storage
            Directory directory = FSDirectory.open(new File("d:/index")); 

            @SuppressWarnings("deprecation")
            IndexWriter writer = new IndexWriter(directory, analyzer, true, new IndexWriter.MaxFieldLength(25000));

            TokenStream tStream = analyzer.tokenStream("contents", tReader);
            @SuppressWarnings("deprecation")
            TermAttribute term = tStream.addAttribute(TermAttribute.class);

            try {
                while (tStream.incrementToken())
                    {
                        result.append(term.term());
                        result.append(" ");
                    }

                Document doc = new Document();
                String title = "DocID";
                // adding title field
                doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED)); 
                String content = result.toString();
                // adding content field
                doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));
                // writing new document to the index
                writer.addDocument(doc);  
                writer.close();
                System.out.println("Reult is: " + result);  
            } 
            catch (IOException ioe)
                {
                    System.out.println("Error: "+ioe.getMessage());
                }
        }

        // If, for some reason, the stemming did not happen, return the original text
        if (result.length()==0)
            result.append(text);
        return result.toString().trim();

    } //end stem

    public static void main (String[] args) throws IOException
        {
            Stemmer.Stem("Michele Bachmann amenities pressed her allegations that the former head of her Iowa presidential bid was bribed by the campaign of rival Ron Paul to endorse him, even as one of her own aides denied the charge.", "English");
        }
}//end class    

共有1个答案

胡俊弼
2023-03-14

要过滤掉停止字,请使用StopAnalyzer。它将删除以下文字:

  "a", "an", "and", "are", "as", "at", "be", "but", "by",
  "for", "if", "in", "into", "is", "it",
  "no", "not", "of", "on", "or", "such",
  "that", "the", "their", "then", "there", "these",
  "they", "this", "to", "was", "will", "with"

如果您使用addDocument(Iterable),则可以提供Analyzer

关于词干分析,请看这篇文章。

很难给出更多建议,因为你没有解释到底是什么失败了。

 类似资料:
  • 问题内容: 我正在寻找一个类或方法,该类或方法需要一个长字符串(包含数百个单词),并进行标记化,删除停用词和词干,以用于IR系统。 例如: “大肥猫,对袋鼠说’我认识的最有趣的家伙’。” 分词器将删除标点符号并返回一个单词 停用词删除器会删除“ the”,“ to”等词 词干会减少每个单词的“词根”,例如“最有趣”会变得很有趣 提前谢谢了。 问题答案: AFAIK Lucene可以做您想要的。用和

  • 我有一列索引,每个索引都有对应的单词: 等等 我想按索引将它们按如下方式分组:对于id 1-[word1,word2,word3]对于id 2-[word4,word5] 诸如此类 并提取到CSV文件 我有这个代码: 我需要做什么改变才能让它起作用? 提前谢谢你

  • 本文向大家介绍python创建属于自己的单词词库 便于背单词,包括了python创建属于自己的单词词库 便于背单词的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python创建单词词库的具体代码,供大家参考,具体内容如下 基本思路:以COCA两万单词表为基础,用python爬取金山词霸的单词词性,词义,音频分别存入sqllite。背单词的时候根据需要自定义数据的选择方式。 效果如下

  • 我一直在用spaCy查找最常用的名词和noun_phrases 在寻找单个名词时,我可以成功地去掉标点符号并停止单词 然而,使用noun_chunks来确定短语会导致属性错误 spacy.tokens.span.Span对象没有属性 我理解的性质的消息但我不能为我的生活得到语法正确的地方存在的停止字在一个emmatiated字符串将排除从被附加到noun_phrases列表 不删除停止字的输出 [

  • 问题内容: 我正在使用elasticsearch 1.1.2。 我在可搜索字段上使用具有不同权重的多重匹配查询。 例: {“ multi_match”:{“ query”:“这是一个测试”,“ fields”:[“ title ^ 3”,“ description ^ 2”,“ body”]}} 因此,在我的示例中,标题的重要性是正文的三倍。 我想根据找到的匹配项为每个字段自定义权重。 假设我搜索

  • 问题内容: 我希望能够搜索每个单词,因此我已清除了停用词列表。比我已经重建了索引。但是不幸的是,如果我输入带有停用词的搜索表达式,它仍然不会返回任何行。如果我只剩下停用词,我一定会得到结果。例如,“双重磨损保持原位”-没有结果,“双重磨损保持原位”-我得到的结果实际上也包含“中”。 有谁知道为什么会这样吗?我正在使用SQL Server 2012 Express。 非常感谢! 问题答案: 同时,我