MMAnalyzer極易中文分詞組件

原文地址:http://xiarilian12.iteye.com/blog/855245

  1. 支持英文、數字、中文(簡體)混合分詞   
  2. 常用的數量和人名的匹配   
  3. 超過22萬詞的詞庫整理   
  4. 實現正向最大匹配算法   
  5.   
  6. //採用正向最大匹配的中文分詞算法,相當於分詞粒度等於0   
  7. MMAnalyzer analyzer = new MMAnalyzer();   
  8.   
  9. //參數爲分詞粒度:當字數等於或超過該參數,且能成詞,該詞就被切分出來   
  10. MMAnalyzer analyzer = new MMAnalyzer(2);   
  11.   
  12.   
  13. //增加一個新詞典,採用每行一個詞的讀取方式   
  14. MMAnalyzer.addDictionary(reader);   
  15.   
  16. //增加一個新詞   
  17. MMAnalyzer.addWord(newWord);   
  18.   
  19.   
  20.    
  21.   
  22. //刪除詞庫中的全部詞語(注意:非常危險的操作,在沒有加載新的詞庫前所有的分詞都將失效)  
  23. MMAnalyzer.clear();  
  24.   
  25. //詞庫中是否包含該詞  
  26. MMAnalyzer.contains(String word);  
  27.   
  28. //從詞庫中移除該詞  
  29. MMAnalyzer.removeWord(String word);  
  30.   
  31. //當前詞庫中包含的詞語總數  
  32. MMAnalyzer.size();  
  33.   
  34.   
  35. view plaincopy to clipboardprint?  
  36. package demo.analysis;      
  37.     
  38. import java.io.IOException;      
  39.     
  40. import jeasy.analysis.MMAnalyzer;      
  41.     
  42. public class Segment      
  43. {      
  44.     
  45. public static void main(String[] args)      
  46. {      
  47. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"      
  48. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"      
  49. "20000餘人受傷,近20萬人無家可歸。";      
  50.     
  51. MMAnalyzer analyzer = new MMAnalyzer();      
  52. try      
  53. {      
  54. System.out.println(analyzer.segment(text, " | "));      
  55. }      
  56. catch (IOException e)      
  57. {      
  58. e.printStackTrace();      
  59. }      
  60. }      
  61. }     
  62. package demo.analysis;   
  63.   
  64. import java.io.IOException;   
  65.   
  66. import jeasy.analysis.MMAnalyzer;   
  67.   
  68. public class Segment   
  69. {   
  70.   
  71. public static void main(String[] args)   
  72. {   
  73. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"   
  74. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"   
  75. "20000餘人受傷,近20萬人無家可歸。";   
  76.   
  77. MMAnalyzer analyzer = new MMAnalyzer();   
  78. try   
  79. {   
  80. System.out.println(analyzer.segment(text, " | "));   
  81. }   
  82. catch (IOException e)   
  83. {   
  84. e.printStackTrace();   
  85. }   
  86. }   
  87. }    
  88.   
  89. 生成效果:   
  90.   
  91. 據 | 路透社 | 報道 | 印度尼西亞 | 社會 | 事務 | 部 | 官員 | 星期二 | 29日 | 表示 | 日惹 | 市 | 附近 | 當地時間 | 27日   
  92.   
  93. | 晨 | 5時 | 53分 | 發生 | 里氏 | 6.2級 | 地震 | 已經 | 造成 | 至少 | 5427人 | 死亡 | 20000 | 餘人 | 受傷 | 近 | 20萬人 | 無家可歸 |   
  94.   
  95.   
  96. view plaincopy to clipboardprint?  
  97. package demo.analysis;      
  98.     
  99. import jeasy.analysis.MMAnalyzer;      
  100.     
  101. import org.apache.lucene.analysis.Analyzer;      
  102. import org.apache.lucene.document.Document;      
  103. import org.apache.lucene.document.Field;      
  104. import org.apache.lucene.index.IndexWriter;      
  105. import org.apache.lucene.queryParser.QueryParser;      
  106. import org.apache.lucene.search.Hits;      
  107. import org.apache.lucene.search.IndexSearcher;      
  108. import org.apache.lucene.search.Query;      
  109. import org.apache.lucene.store.Directory;      
  110. import org.apache.lucene.store.RAMDirectory;      
  111.     
  112. public class Segment      
  113. {      
  114.     
  115. public static void main(String[] args)      
  116. {      
  117. String fieldName = "text";      
  118. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"      
  119. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"      
  120. "20000餘人受傷,近20萬人無家可歸。"//檢索內容      
  121.     
  122. //採用正向最大匹配的中文分詞算法      
  123. Analyzer analyzer = new MMAnalyzer();      
  124.     
  125. Directory directory = new RAMDirectory();      
  126. //Directory directory = FSDirectory.getDirectory("/tmp/testindex", true);      
  127.     
  128. try      
  129. {      
  130. IndexWriter iwriter = new IndexWriter(directory, analyzer, true);      
  131. iwriter.setMaxFieldLength(25000);      
  132. Document doc = new Document();      
  133. doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.TOKENIZED));      
  134. iwriter.addDocument(doc);      
  135. iwriter.close();      
  136.     
  137. IndexSearcher isearcher = new IndexSearcher(directory);      
  138. QueryParser parser = new QueryParser(fieldName, analyzer);      
  139. Query query = parser.parse("印度尼西亞 6.2級地震");//檢索詞      
  140. Hits hits = isearcher.search(query);      
  141. System.out.println("命中:" + hits.length());      
  142.     
  143. for (int i = 0; i < hits.length(); i++)      
  144. {      
  145. Document hitDoc = hits.doc(i);      
  146. System.out.println("內容:" + hitDoc.get(fieldName));      
  147. }      
  148.     
  149. isearcher.close();      
  150. directory.close();      
  151. }      
  152. catch (Exception e)      
  153. {      
  154. e.printStackTrace();      
  155. }      
  156. }      
  157.     
  158. }     
  159. package demo.analysis;   
  160.   
  161. import jeasy.analysis.MMAnalyzer;   
  162.   
  163. import org.apache.lucene.analysis.Analyzer;   
  164. import org.apache.lucene.document.Document;   
  165. import org.apache.lucene.document.Field;   
  166. import org.apache.lucene.index.IndexWriter;   
  167. import org.apache.lucene.queryParser.QueryParser;   
  168. import org.apache.lucene.search.Hits;   
  169. import org.apache.lucene.search.IndexSearcher;   
  170. import org.apache.lucene.search.Query;   
  171. import org.apache.lucene.store.Directory;   
  172. import org.apache.lucene.store.RAMDirectory;   
  173.   
  174. public class Segment   
  175. {   
  176.   
  177. public static void main(String[] args)   
  178. {   
  179. String fieldName = "text";   
  180. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"   
  181. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"   
  182. "20000餘人受傷,近20萬人無家可歸。"//檢索內容   
  183.   
  184. //採用正向最大匹配的中文分詞算法   
  185. Analyzer analyzer = new MMAnalyzer();   
  186.   
  187. Directory directory = new RAMDirectory();   
  188. //Directory directory = FSDirectory.getDirectory("/tmp/testindex", true);   
  189.   
  190. try   
  191. {   
  192. IndexWriter iwriter = new IndexWriter(directory, analyzer, true);   
  193. iwriter.setMaxFieldLength(25000);   
  194. Document doc = new Document();   
  195. doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.TOKENIZED));   
  196. iwriter.addDocument(doc);   
  197. iwriter.close();   
  198.   
  199. IndexSearcher isearcher = new IndexSearcher(directory);   
  200. QueryParser parser = new QueryParser(fieldName, analyzer);   
  201. Query query = parser.parse("印度尼西亞 6.2級地震");//檢索詞   
  202. Hits hits = isearcher.search(query);   
  203. System.out.println("命中:" + hits.length());   
  204.   
  205. for (int i = 0; i < hits.length(); i++)   
  206. {   
  207. Document hitDoc = hits.doc(i);   
  208. System.out.println("內容:" + hitDoc.get(fieldName));   
  209. }   
  210.   
  211. isearcher.close();   
  212. directory.close();   
  213. }   
  214. catch (Exception e)   
  215. {   
  216. e.printStackTrace();   
  217. }   
  218. }   
  219.   
  220. }    
  221.   
  222. 生成效果:   
  223.   
  224. 命中:1   
  225. 內容:據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,日惹市附近當地時間27日晨553分發生   
  226.   
  227. 的里氏6.2級地震已經造成至少5427人死亡,20000餘人受傷,近20萬人無家可歸。   
  228.   
  229.   
  230. view plaincopy to clipboardprint?  
  231. package demo.analysis;      
  232.     
  233. import jeasy.analysis.MMAnalyzer;      
  234.     
  235. import org.apache.lucene.analysis.Analyzer;      
  236. import org.apache.lucene.analysis.TokenStream;      
  237. import org.apache.lucene.document.Document;      
  238. import org.apache.lucene.document.Field;      
  239. import org.apache.lucene.index.IndexReader;      
  240. import org.apache.lucene.index.IndexWriter;      
  241. import org.apache.lucene.index.TermPositionVector;      
  242. import org.apache.lucene.queryParser.QueryParser;      
  243. import org.apache.lucene.search.Hits;      
  244. import org.apache.lucene.search.IndexSearcher;      
  245. import org.apache.lucene.search.Query;      
  246. import org.apache.lucene.search.highlight.Highlighter;      
  247. import org.apache.lucene.search.highlight.QueryScorer;      
  248. import org.apache.lucene.search.highlight.TokenSources;      
  249. import org.apache.lucene.store.Directory;      
  250. import org.apache.lucene.store.RAMDirectory;      
  251.     
  252. public class Segment      
  253. {      
  254.     
  255. public static void main(String[] args)      
  256. {      
  257. String fieldName = "text";      
  258. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"      
  259. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"      
  260. "20000餘人受傷,近20萬人無家可歸。"//檢索內容      
  261.     
  262. //採用正向最大匹配的中文分詞算法      
  263. Analyzer analyzer = new MMAnalyzer();      
  264.     
  265. Directory directory = new RAMDirectory();      
  266. //Directory directory = FSDirectory.getDirectory("/tmp/testindex", true);      
  267.     
  268. try      
  269. {      
  270. IndexWriter iwriter = new IndexWriter(directory, analyzer, true);      
  271. iwriter.setMaxFieldLength(25000);      
  272. Document doc = new Document();      
  273. doc.add(new Field(fieldName, text, Field.Store.YES,      
  274. Field.Index.TOKENIZED,      
  275. Field.TermVector.WITH_POSITIONS_OFFSETS));      
  276. iwriter.addDocument(doc);      
  277. iwriter.close();      
  278.     
  279. IndexSearcher isearcher = new IndexSearcher(directory);      
  280. QueryParser parser = new QueryParser(fieldName, analyzer);      
  281. Query query = parser.parse("印度尼西亞 6.2級地震");//檢索詞      
  282. Hits hits = isearcher.search(query);      
  283. System.out.println("命中:" + hits.length());      
  284.     
  285. Highlighter highlighter = new Highlighter(new QueryScorer(query));      
  286. for (int i = 0; i < hits.length(); i++)      
  287. {      
  288. text = hits.doc(i).get(fieldName);      
  289. TermPositionVector tpv = (TermPositionVector) IndexReader.open(      
  290. directory).getTermFreqVector(hits.id(i), fieldName);      
  291. TokenStream tokenStream = TokenSources.getTokenStream(tpv);      
  292. String result = highlighter.getBestFragments(tokenStream, text, 3"...");      
  293. System.out.println("內容:" + result);      
  294. }      
  295.     
  296. isearcher.close();      
  297. directory.close();      
  298. }      
  299. catch (Exception e)      
  300. {      
  301. e.printStackTrace();      
  302. }      
  303. }      
  304.     
  305. }     
  306. package demo.analysis;   
  307.   
  308. import jeasy.analysis.MMAnalyzer;   
  309.   
  310. import org.apache.lucene.analysis.Analyzer;   
  311. import org.apache.lucene.analysis.TokenStream;   
  312. import org.apache.lucene.document.Document;   
  313. import org.apache.lucene.document.Field;   
  314. import org.apache.lucene.index.IndexReader;   
  315. import org.apache.lucene.index.IndexWriter;   
  316. import org.apache.lucene.index.TermPositionVector;   
  317. import org.apache.lucene.queryParser.QueryParser;   
  318. import org.apache.lucene.search.Hits;   
  319. import org.apache.lucene.search.IndexSearcher;   
  320. import org.apache.lucene.search.Query;   
  321. import org.apache.lucene.search.highlight.Highlighter;   
  322. import org.apache.lucene.search.highlight.QueryScorer;   
  323. import org.apache.lucene.search.highlight.TokenSources;   
  324. import org.apache.lucene.store.Directory;   
  325. import org.apache.lucene.store.RAMDirectory;   
  326.   
  327. public class Segment   
  328. {   
  329.   
  330. public static void main(String[] args)   
  331. {   
  332. String fieldName = "text";   
  333. String text = "據路透社報道,印度尼西亞社會事務部一官員星期二(29日)表示,"   
  334. "日惹市附近當地時間27日晨5時53分發生的里氏6.2級地震已經造成至少5427人死亡,"   
  335. "20000餘人受傷,近20萬人無家可歸。"//檢索內容   
  336.   
  337. //採用正向最大匹配的中文分詞算法   
  338. Analyzer analyzer = new MMAnalyzer();   
  339.   
  340. Directory directory = new RAMDirectory();   
  341. //Directory directory = FSDirectory.getDirectory("/tmp/testindex", true);   
  342.   
  343. try   
  344. {   
  345. IndexWriter iwriter = new IndexWriter(directory, analyzer, true);   
  346. iwriter.setMaxFieldLength(25000);   
  347. Document doc = new Document();   
  348. doc.add(new Field(fieldName, text, Field.Store.YES,   
  349. Field.Index.TOKENIZED,   
  350. Field.TermVector.WITH_POSITIONS_OFFSETS));   
  351. iwriter.addDocument(doc);   
  352. iwriter.close();   
  353.   
  354. IndexSearcher isearcher = new IndexSearcher(directory);   
  355. QueryParser parser = new QueryParser(fieldName, analyzer);   
  356. Query query = parser.parse("印度尼西亞 6.2級地震");//檢索詞   
  357. Hits hits = isearcher.search(query);   
  358. System.out.println("命中:" + hits.length());   
  359.   
  360. Highlighter highlighter = new Highlighter(new QueryScorer(query));   
  361. for (int i = 0; i < hits.length(); i++)   
  362. {   
  363. text = hits.doc(i).get(fieldName);   
  364. TermPositionVector tpv = (TermPositionVector) IndexReader.open(   
  365. directory).getTermFreqVector(hits.id(i), fieldName);   
  366. TokenStream tokenStream = TokenSources.getTokenStream(tpv);   
  367. String result = highlighter.getBestFragments(tokenStream, text, 3"...");   
  368. System.out.println("內容:" + result);   
  369. }   
  370.   
  371. isearcher.close();   
  372. directory.close();   
  373. }   
  374. catch (Exception e)   
  375. {   
  376. e.printStackTrace();   
  377. }   
  378. }   
  379.   
  380. }   
  381.    
  382. 生成效果:   
  383.   
  384. 命中:1   
  385. 內容:據路透社報道,<B>印度尼西亞</B>社會事務部一官員星期二(29日)表示,日惹市附近當地時間27日晨553分發生的   
  386.   
  387. 里氏<B>6.2級</B><B>地震</B>已經造成至少5427人死亡,20000餘人受傷,近20萬人無家可歸  
  388.   
  389.   
  390.   
  391. 本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xiaoping8411/archive/2010/03/30/5435134.aspx  

發佈了110 篇原創文章 · 獲贊 16 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章