浏览 2149 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (15) :: 隐藏帖 (0)
|
|||||
---|---|---|---|---|---|
作者 | 正文 | ||||
发表时间:2010-03-06
分两种情况: 1.文本在内存中 2.文本在硬盘文件上 方案利用ArrayList 声明一个类 public class Entity { String word; float pValue; public Entity() { pValue=0; word=""; } } 1.文本在内存中主类中有以下代码 String []words={"小","团圆","究竟","泄了","张爱玲","什么","秘密","2009年","04月","08日","09:56","天天","小","团圆","究竟","哈哈","张爱玲","全额","天涯","张爱玲"}; ArrayList<Entity> enList=new ArrayList(); for(String w: words) { w=w.trim(); Entity en=new Entity(); en.word=w; en.pValue=1; enList.add(en); //System.out.println(w); } for(int i=0;i<enList.size()-1;i++) { if(!enList.get(i).word.isEmpty()) { for(int j=i+1;j<enList.size();j++) { if(enList.get(i).word==enList.get(j).word) { enList.get(i).pValue++; enList.get(j).pValue=0; enList.get(j).word=""; } } } } for(Entity e : enList) { System.out.println(e.word+e.pValue); } System.out.println(enList.size()); 结果如下
2.文本在硬盘文件中 主类代码如下 public static void main(String[] args) throws FileNotFoundException,IOException { // TODO Auto-generated method stub; String result=CutText("E:/自然语言处理/KL/sb.txt"); String []words=result.split("\\|"); ArrayList<Entity> enList=new ArrayList(); for(String w: words) { w=w.trim(); Entity en=new Entity(); en.word=w; en.pValue=1; enList.add(en); //System.out.println(w); } for(int i=0;i<enList.size()-1;i++) { if(!enList.get(i).word.isEmpty()) { for(int j=i+1;j<enList.size();j++) { if(enList.get(i).word==enList.get(j).word) { enList.get(i).pValue++; enList.get(j).pValue=0; enList.get(j).word=""; } } } } for(Entity e : enList) { System.out.println(e.word+e.pValue); } System.out.println(enList.size()); } 结果如下:
可以看出当从硬盘中读文件后,该方法没有有效统计处文本中同一个词出现的个数 读取硬盘文件的函数以及分词函数如下 public static String GetFileText(String path) throws FileNotFoundException,IOException { InputStreamReader inStreamReader=new InputStreamReader(new FileInputStream(path)); //String strFile1= BufferedReader bufReader=new BufferedReader(inStreamReader); String line; StringBuilder sb=new StringBuilder(); while((line=bufReader.readLine())!=null) { sb.append(line+" "); } inStreamReader.close(); bufReader.close(); String strFile=sb.toString(); return strFile; } /*this function cut a piece of text in to words sequeces*/ public static String CutText(String path)throws FileNotFoundException,IOException { String fileText=GetFileText(path); MMAnalyzer analyzer=new MMAnalyzer(); String result =null; String spliter="|"; try { result = analyzer.segment(fileText, spliter); } catch (IOException e) { e.printStackTrace(); } //System.out.print(result); return result; } 但是如果将: if(enList.get(i).word==enList.get(j).word) { enList.get(i).pValue++; enList.get(j).pValue=0; enList.get(j).word=""; } 改为 if([color=cyan]enList.get(i).word.equals(enList.get(j).word))[/color] { enList.get(i).pValue++; enList.get(j).pValue=0; enList.get(j).word=""; } 则两种情况下都能正确统计出同一个词的出现次数这是为啥呢? 为了方便大家研究,我把这段代码上传,其中用到了jeasey分词器,和lucene.jar 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||
返回顶楼 | |||||
发表时间:2010-03-07
enList.get(i).word==enList.get(j).word
string pool |
|||||
返回顶楼 | |||||
发表时间:2010-03-07
抛出异常的爱 写道 enList.get(i).word==enList.get(j).word
string pool string pool是什么意思? 能详细说下嘛?我刚开始用java |
|||||
返回顶楼 | |||||
发表时间:2010-03-07
finallyliuyu 写道 抛出异常的爱 写道 enList.get(i).word==enList.get(j).word
string pool string pool是什么意思? 能详细说下嘛?我刚开始用java 他们能达成==不是由于他们的值相等 而是凑巧他们是从同一个池中得到的两个引用。。。。。 值等在java中只有equle. ==比的是引用。 |
|||||
返回顶楼 | |||||
发表时间:2010-03-08
非常感谢你
|
|||||
返回顶楼 | |||||