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  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值