关于英文分词器的具体实现

我是悟空 发布于 2014/03/23 13:06
阅读 1K+
收藏 1

Java新手一枚 想编一个程序实现对文件夹内的所有txt文件(英文内容)单词的词频统计 需要用到英文分词器 于是在网上寻找代码 修修改改 还是有问题 下面把代码贴上来

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;  
  
import org.apache.lucene.analysis.TokenStream;  
import org.apache.lucene.analysis.standard.StandardAnalyzer;  
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
import org.apache.lucene.analysis.util.CharArraySet;  
import org.apache.lucene.util.Version;  
  
public class StandardAnalyzerTest { 
public  static String readTxtFile(String filePath){
        try {
                String encoding="Unicode";
                File file=new File(filePath);
                
                if(file.isFile() && file.exists()){ //判断文件是否存在
               
                    InputStreamReader read = new InputStreamReader(
                    new FileInputStream(file),encoding);//考虑到编码格式
                   
                    BufferedReader bufferedReader = new BufferedReader(read);
                    
                    
                 
                    
                    String t=null;
                    String tmpt=null;
                    while((tmpt= bufferedReader.readLine()) != null){
                    t+=tmpt;
                    }return(tmpt);
                    }
                else return"";
                
        }
catch(Exception e){return "";}
}
  
    public static void main(String[] args) {  
        try {  
            // 要处理的文本  
            // "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  
        File f = new File("D:\\1");
        String[] name = f.list();
       


            for(int j=0;j<name.length;j++){
            String []text=new String[name.length];
            
                      String filePath = name[j];
                      System.out.println(name[j]);
                       text[j] =readTxtFile("D:\\1\\"+filePath);
                       
         
  
            // 自定义停用词  
            String[] self_stop_words = { "Lucene", "release", "Apache" };  
            CharArraySet cas = new CharArraySet(Version.LUCENE_CURRENT, 0, true);  
            for (int i = 0; i < self_stop_words.length; i++) {  
                cas.add(self_stop_words[i]);  
            }  
  
            // 加入系统默认停用词  
            Iterator itor = StandardAnalyzer.STOP_WORDS_SET.iterator();  
            while (itor.hasNext()) {  
                cas.add(itor.next());  
            }  
  
            // 标准分词器(Lucene内置的标准分析器,会将语汇单元转成小写形式,并去除停用词及标点符号)  
            StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_CURRENT, cas);  
  
            TokenStream ts = sa.tokenStream("field", text[j]);  
            CharTermAttribute ch = (CharTermAttribute) ts.addAttribute(CharTermAttribute.class);  
  
            ts.reset();  
            FileWriter fw=new FileWriter("D:\\2\\"+name[j]);
            PrintWriter out=new PrintWriter(new BufferedWriter(fw));
            while (ts.incrementToken()) {  
                out.println(ch.toString());  
            }  
            ts.end();  
            ts.close(); 
             
         }
        }
        
            catch (Exception ex) {  
            ex.printStackTrace(); 
        } 
            System.exit(0);  
        }  
}
  
 
错误信息:java.lang.NullPointerException
at org.apache.lucene.analysis.ReusableStringReader.setValue(ReusableStringReader.java:29)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:177)
at StandardAnalyzerTest.main(StandardAnalyzerTest.java:77)


TokenStream ts = sa.tokenStream("field", text[j]); 中的  text[j]改成一个字符串常量就可以运行 请问有人知道这是怎么回事么

加载中
返回顶部
顶部