Paoding Analyzer

je分詞用lucene.中文分詞庖丁解牛


一般使用
使用評估
參考資料
下載
開始使用
分詞策略

效果體驗
 在命令行模式下執行analyzer.bat(windows)或analyzer.sh(linux)即可0
u       顯示幫助
E:\Paoding-Analysis>analyzer.bat ?
u       分詞對話
多次輸入或粘貼不同的文字內容,查看分詞效果,如:
E:\Paoding-Analysis>analyzer.bat
paoding> |
 此時使用者可以在光標所在所在位置(|)輸入或粘貼待分詞的內容(以分號結束),按下Enter鍵換行,analyzer.bat便可以輸出分詞結果。
paoding> 中文分詞;
1:      中文/分詞/
        分詞器net.paoding.analysis.analyzer.PaodingAnalyzer
        內容長度 4字符, 分 2個詞
        分詞耗時 0ms
--------------------------------------------------
分詞完畢後,又會進入以上對話模式。
鍵入:e或:q退出會話 (包括:符號) 。
鍵入:?顯示幫助(包括:符號) 。

u       對文件進行分詞
analyzer.bat允許對指定的文件進行分詞體驗。文件以路徑名給出可以使絕對地址、相對當前目錄的地址,或以classpath:爲前綴的類路徑地址。示例如下:
paoding> :-f E:/content.txt
paoding> :-f E:/content.txt -c gbk
paoding> :-f E:/content.txt -c gbk -m max

開始使用
 第一步:安裝詞典
將程序存儲在某個目錄下,這個目錄稱爲安裝目錄!
 將程序拷貝到安裝目錄稱爲安裝程序!
 增加、刪除、修改程序稱爲自定製程序!

 第二步:配置詞典系統環境變量
 庖丁中文分詞需要一套詞典,使用者安裝辭典後,應該設置系統環境變量PAODING_DIC_HOME指向詞典安裝目錄。
在windows下,通過“我的電腦”屬性之“高級”選項卡,然後在進入“環境變量”編輯區,新建環境變量,設置“變量名”爲PAODING_DIC_HOME;“變量值”爲E:/data/paoding/dic
工程中使用分詞,dic文件包copy到 web-info/classes 下面!


 第三步:將庖丁JAR類庫導入工程
 將paoding-analysis.jar添加到工程。
 至此,便可以在應用代碼中使用庖丁提供的中文分析器了。
 
 提醒:以下示例代碼中的IDNEX_PATH表示索引庫地址,讀者運行以下代碼前,應該賦與一個不重要的地址,比如/data/paoding/test_index 或E:/paoding_test_index,以免一時疏忽將重要數據丟失。

 

Java代碼  收藏代碼
  1. package net.paoding.analysis;  
  2.   
  3. import net.paoding.analysis.analyzer.PaodingAnalyzer;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.TokenStream;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.IndexReader;  
  10. import org.apache.lucene.index.IndexWriter;  
  11. import org.apache.lucene.index.TermPositionVector;  
  12. import org.apache.lucene.queryParser.QueryParser;  
  13. import org.apache.lucene.search.Hits;  
  14. import org.apache.lucene.search.IndexSearcher;  
  15. import org.apache.lucene.search.Query;  
  16. import org.apache.lucene.search.Searcher;  
  17. import org.apache.lucene.search.highlight.Formatter;  
  18. import org.apache.lucene.search.highlight.Highlighter;  
  19. import org.apache.lucene.search.highlight.QueryScorer;  
  20. import org.apache.lucene.search.highlight.TokenGroup;  
  21. import org.apache.lucene.search.highlight.TokenSources;  
  22.   
  23. /** 
  24.  * 創建索引庫 
  25.  * @author Administrator 
  26.  * 
  27.  */  
  28. public class CreateIndexLibTest {  
  29.     public static void main(String[] args) throws Exception {  
  30.           
  31.         /** 創建分詞 */  
  32.         // 詞典目錄  
  33.         String path = "D:\\Java\\paoding_analyzer\\dic";  
  34.         // 庖丁解牛中文分詞器  
  35.         Analyzer analyzer = new PaodingAnalyzer();  
  36.         // 索引書寫器  
  37.         IndexWriter writer = new IndexWriter(path, analyzer, true);  
  38.         // 文檔  
  39.         Document doc = new Document();  
  40.         // 字段  
  41.         Field field = new Field(  
  42.                 "content",                                  // name  
  43.                 "你好,世界!",                               // value  
  44.                 Field.Store.YES,                            // store  
  45.                 Field.Index.TOKENIZED,                      // index  
  46.                 Field.TermVector.WITH_POSITIONS_OFFSETS);   // termVector  
  47.         doc.add(field);             // 文檔添加字段  
  48.         writer.addDocument(doc);    // 索引書寫器添加文檔  
  49.         writer.close();  
  50.         System.out.println("Indexed success!");  
  51.            
  52.         /** 搜索關鍵詞 */  
  53.         // 索引讀取器  
  54.         IndexReader reader = IndexReader.open(path);  
  55.         // 查詢解析器  
  56.         QueryParser parser = new QueryParser("content", analyzer);  
  57.         Query query = parser.parse("你好");   // 解析  
  58.         // 搜索器  
  59.         Searcher searcher = new IndexSearcher(reader);  
  60.         // 命中  
  61.         Hits hits = searcher.search(query);  
  62.         if (hits.length() == 0) {  
  63.             System.out.println("hits.length=0");  
  64.         }  
  65.           
  66.         /** 高亮顯示搜索的關鍵詞 */     
  67.         Document doc2 = hits.doc(0);  
  68.         //高亮處理  
  69.         String text = doc2.get("content");  
  70.         // 條件位置載體  
  71.         TermPositionVector tpv = (TermPositionVector) reader.getTermFreqVector(// 獲得條件次數載體  
  72.                         0"content");  
  73.         // 記號流  
  74.         TokenStream ts = TokenSources.getTokenStream(tpv);  
  75.         // 格式化器  
  76.         Formatter formatter = new Formatter() {  
  77.             // 高亮條件  
  78.             public String highlightTerm(String srcText, TokenGroup g) {  
  79.                 if (g.getTotalScore() <= 0) {  
  80.                     return srcText;  
  81.                 }  
  82.                 return "<b>" + srcText + "</b>";  
  83.             }  
  84.         };  
  85.         // 高亮器  
  86.         Highlighter highlighter = new Highlighter(  
  87.                 formatter,   
  88.                 new QueryScorer(query));    // 查詢記錄員  
  89.         // 獲得最好的片段  
  90.         String result = highlighter.getBestFragments(ts, text, 5"…");  
  91.         System.out.println("result:\n\t" + result);  
  92.         reader.close();  
  93.   
  94.     }  
  95. }  

 

 

 

Java代碼  收藏代碼
  1. package net.paoding.analysis;  
  2.   
  3. import java.io.StringReader;  
  4.   
  5. import junit.framework.TestCase;  
  6. import net.paoding.analysis.analyzer.PaodingAnalyzer;  
  7.   
  8. import org.apache.lucene.analysis.Token;  
  9. import org.apache.lucene.analysis.TokenStream;  
  10. /** 
  11.  * 解析器單元測試(JUnit) 
  12.  * @author Administrator 
  13.  * 
  14.  */  
  15. public class AnalyzerTest extends TestCase {  
  16.   
  17.     protected PaodingAnalyzer analyzer = new PaodingAnalyzer();  
  18.   
  19.     protected StringBuilder sb = new StringBuilder();  
  20.   
  21.     /** 
  22.      * 解剖分詞 
  23.      * @param input 
  24.      * @return 
  25.      */  
  26.     protected String dissect(String input) {  
  27.         try {  
  28.             TokenStream ts = analyzer.tokenStream(""new StringReader(input));  
  29.             Token token;  
  30.             sb.setLength(0);  
  31.             while ((token = ts.next()) != null) {  
  32.                 sb.append(token.termText()).append('/');  
  33.             }  
  34.             if (sb.length() > 0) {  
  35.                 sb.setLength(sb.length() - 1);  
  36.             }  
  37.             System.out.println(sb.toString());  
  38.             return sb.toString();  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace();  
  41.             return "error";  
  42.         }  
  43.     }  
  44.   
  45.     /** 
  46.      * 斷言值: 預測的分詞 
  47.      * 結果值:詞典中的分詞 
  48.      * 解剖關鍵字 "a",返回"",表示在詞典分詞策略中字母(a)不是一個分詞 
  49.      * 斷言結果爲Green bar 表示,返回的結果與斷言中的結果相同。 
  50.      */  
  51.     public void test000() {  
  52.         String result = dissect("a");  
  53.         assertEquals("", result);       // (斷言值,結果值)  
  54.     }  
  55.   
  56.     /** 
  57.      * 
  58.      */  
  59.     public void test001() {  
  60.         String result = dissect("空格 a 空格");  
  61.         assertEquals("空格/空格", result);  
  62.     }  
  63.   
  64.     /** 
  65.      * 
  66.      */  
  67.     public void test002() {  
  68.         String result = dissect("A座");  
  69.         assertEquals("a座", result);  
  70.     }  
  71.       
  72.     /** 
  73.      * 
  74.      */  
  75.     public void test003() {  
  76.         String result = dissect("u盤");  
  77.         assertEquals("u盤", result);  
  78.     }  
  79.   
  80.     public void test004() {  
  81.         String result = dissect("剛買的u盤的容量");  
  82.         assertEquals("剛/買的/u盤/容量", result); // 中文分詞效果  
  83.     }  
  84.       
  85.     public void test005() {  
  86.         String result = dissect("K歌之王很好聽");  
  87.         assertEquals("k歌之王/很好/好聽", result);  
  88.     }  
  89.     // --------------------------------------------------------------  
  90.     // 僅包含詞語的句子分詞策略  
  91.     // --------------------------------------------------------------  
  92.   
  93.     /** 
  94.      * 句子全由詞典詞語組成,但詞語之間沒有包含、交叉關係 
  95.      */  
  96.     public void test100() {  
  97.         String result = dissect("臺北中文國際");  
  98.         assertEquals("臺北/中文/國際", result);  
  99.     }  
  100.   
  101.     /** 
  102.      * 句子全由詞典詞語組成,但詞語之間有包含關係 
  103.      */  
  104.     public void test101() {  
  105.         String result = dissect("北京首都機場");  
  106.         assertEquals("北京/首都/機場", result);  
  107.     }  
  108.   
  109.     /** 
  110.      * 句子全由詞典詞語組成,但詞語之間有交叉關係 
  111.      */  
  112.     public void test102() {  
  113.         String result = dissect("東西已經拍賣了");  
  114.         assertEquals("東西/已經/拍賣/賣了", result);  
  115.     }  
  116.   
  117.     /** 
  118.      * 句子全由詞典詞語組成,但詞語之間有包含、交叉等複雜關係 
  119.      */  
  120.     public void test103() {  
  121.         String result = dissect("羽毛球拍");  
  122.         assertEquals("羽毛/羽毛球/球拍", result);  
  123.     }  
  124.   
  125.     // --------------------------------------------------------------  
  126.     // noise(噪音)詞彙和單字的分詞策略  
  127.     // --------------------------------------------------------------  
  128.   
  129.     /** 
  130.      * 詞語之間有一個noise字(的) 
  131.      */  
  132.     public void test200() {  
  133.         String result = dissect("足球的魅力");  
  134.         assertEquals("足球/魅力", result);  
  135.     }  
  136.   
  137.     /** 
  138.      * 詞語之間有一個noise詞語(因之) 
  139.      */  
  140.     public void test201() {  
  141.         String result = dissect("主人因之生氣");  
  142.         assertEquals("主人/生氣", result);  
  143.     }  
  144.   
  145.     /** 
  146.      * 詞語前後分別有單字和雙字的noise詞語(與,有關) 
  147.      */  
  148.     public void test202() {  
  149.         String result = dissect("與謀殺有關");  
  150.         assertEquals("謀殺", result);  
  151.     }  
  152.   
  153.     /** 
  154.      * 前有noise詞語(哪怕),後面跟隨了連續的noise單字(了,你) 
  155.      */  
  156.     public void test203() {  
  157.         String result = dissect("哪怕朋友背叛了你");  
  158.         assertEquals("朋友/背叛", result);  
  159.     }  
  160.   
  161.     /** 
  162.      * 前後連續的noise詞彙(雖然,某些),詞語中有noise單字(很) 
  163.      */  
  164.     public void test204() {  
  165.         String result = dissect("雖然某些動物很兇惡");  
  166.         assertEquals("動物/兇惡", result);  
  167.     }  
  168.   
  169.     // --------------------------------------------------------------  
  170.     // 詞典沒有收錄的字符串的分詞策略  
  171.     // --------------------------------------------------------------  
  172.   
  173.       
  174.     /** 
  175.      * 僅1個字的非詞彙串(東,西,南,北) 
  176.      */  
  177.     public void test300() {  
  178.         String result = dissect("東&&西&&南&&北");  
  179.         assertEquals("東/西/南/北", result);  
  180.     }  
  181.   
  182.       
  183.     /** 
  184.      * 僅兩個字的非詞彙串(古哥,谷歌,收狗,搜狗) 
  185.      */  
  186.     public void test302() {  
  187.         String result = dissect("古哥&&谷歌&&收狗&&搜狗");  
  188.         assertEquals("古哥/谷歌/收狗/搜狗", result);  
  189.     }  
  190.       
  191.     /** 
  192.      * 多個字的非詞彙串 
  193.      */  
  194.     public void test303() {  
  195.         String result = dissect("這是鳥語:玉魚遇欲雨");  
  196.         assertEquals("這是/鳥語/玉魚/魚遇/遇欲/欲雨", result);  
  197.     }  
  198.       
  199.     /** 
  200.      * 兩個詞語之間有一個非詞彙的字(真) 
  201.      */  
  202.     public void test304() {  
  203.         String result = dissect("朋友真背叛了你了!");  
  204.         assertEquals("朋友/真/背叛", result);  
  205.     }  
  206.       
  207.     /** 
  208.      * 兩個詞語之間有一個非詞彙的字符串(盒蟹) 
  209.      */  
  210.     public void test305() {  
  211.         String result = dissect("建設盒蟹社會");  
  212.         assertEquals("建設/盒蟹/社會", result);  
  213.     }  
  214.       
  215.     /** 
  216.      * 兩個詞語之間有多個非詞彙的字符串(盒少蟹) 
  217.      */  
  218.     public void test306() {  
  219.         String result = dissect("建設盒少蟹社會");  
  220.         assertEquals("建設/盒少/少蟹/社會", result);  
  221.     }  
  222.   
  223.     // --------------------------------------------------------------  
  224.     // 不包含小數點的漢字數字  
  225.     // --------------------------------------------------------------  
  226.   
  227.   
  228.     /** 
  229.      * 單個漢字數字 
  230.      */  
  231.     public void test400() {  
  232.         String result = dissect("二");  
  233.         assertEquals("2", result);  
  234.     }  
  235.   
  236.     /** 
  237.      * 兩個漢字數字 
  238.      */  
  239.     public void test61() {  
  240.         String result = dissect("五六");  
  241.         assertEquals("56", result);  
  242.     }  
  243.   
  244.     /** 
  245.      * 多個漢字數字 
  246.      */  
  247.     public void test62() {  
  248.         String result = dissect("三四五六");  
  249.         assertEquals("3456", result);  
  250.     }  
  251.   
  252.     /** 
  253.      * 十三 
  254.      */  
  255.     public void test63() {  
  256.         String result = dissect("十三");  
  257.         assertEquals("13", result);  
  258.     }  
  259.   
  260.     /** 
  261.      * 二千 
  262.      */  
  263.     public void test65() {  
  264.         String result = dissect("二千");  
  265.         assertEquals("2000", result);  
  266.     }  
  267.   
  268.     /** 
  269.      * 兩千 
  270.      */  
  271.     public void test651() {  
  272.         String result = dissect("兩千");  
  273.         assertEquals("2000", result);  
  274.     }  
  275.     /** 
  276.      * 兩千 
  277.      */  
  278.     public void test6511() {  
  279.         String result = dissect("兩千個");  
  280.         assertEquals("2000/個", result);  
  281.     }  
  282.   
  283.     /** 
  284.      * 2千 
  285.      */  
  286.     public void test652() {  
  287.         String result = dissect("2千");  
  288.         assertEquals("2000", result);  
  289.     }  
  290.       
  291.     /** 
  292.      *  
  293.      */  
  294.     public void test653() {  
  295.         String result = dissect("3千萬");  
  296.         assertEquals("30000000", result);  
  297.     }  
  298.       
  299.     /** 
  300.      *  
  301.      */  
  302.     public void test654() {  
  303.         String result = dissect("3千萬個案例");  
  304.         assertEquals("30000000/個/案例", result);  
  305.     }  
  306.   
  307.   
  308.     /** 
  309.      *  
  310.      */  
  311.     public void test64() {  
  312.         String result = dissect("千萬");  
  313.         assertEquals("千萬", result);  
  314.     }  
  315.   
  316.     public void test66() {  
  317.         String result = dissect("兩兩");  
  318.         assertEquals("兩兩", result);  
  319.     }  
  320.   
  321.     public void test67() {  
  322.         String result = dissect("二二");  
  323.         assertEquals("22", result);  
  324.     }  
  325.   
  326.     public void test68() {  
  327.         String result = dissect("2.2兩");  
  328.         assertEquals("2.2/兩", result);  
  329.     }  
  330.   
  331.     public void test69() {  
  332.         String result = dissect("二兩");  
  333.         assertEquals("2/兩", result);  
  334.     }  
  335.   
  336.   
  337.     public void test690() {  
  338.         String result = dissect("2兩");  
  339.         assertEquals("2/兩", result);  
  340.     }  
  341.   
  342.     public void test691() {  
  343.         String result = dissect("2千克");  
  344.         assertEquals("2000/克", result);  
  345.     }  
  346.   
  347.     public void test692() {  
  348.         String result = dissect("2公斤");  
  349.         assertEquals("2/公斤", result);  
  350.     }  
  351.   
  352.     public void test693() {  
  353.         String result = dissect("2世紀");  
  354.         assertEquals("2/世紀", result);  
  355.     }  
  356.   
  357.     public void test7() {  
  358.         String result = dissect("哪怕二");  
  359.         assertEquals("2", result);  
  360.     }  
  361.   
  362. }  

 

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