<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      全文檢索、數據挖掘、推薦引擎系列3---全文內容推薦引擎之中文分詞

      基于內容的推薦引擎有兩種實現途徑,一種是根據條目的元數據(可以將元數據理解為屬性),另一種是根據條目的文本描述信息。本系列中將先描述基于條目描述信息的全文檢索實現方式,然后描述基于元數據的內容推薦引擎實現方式。

      對于基于條目文本描述信息的內容推薦引擎,目前有很多資料可以參考,基本步聚是先對文本內容進行分詞,包括提取出單詞、去掉常用詞如的地得、加入同意詞、對英語還有去掉復數形式和過去分詞形式等;第二步是計算各個詞在每篇文章中的出現頻率,以及在所有文章中的出現頻率,即TF/IDF;第三步計算文章向量;最后是利用自動聚類算法,對條目進行聚類,這樣就可以實現向用戶推薦同類產品的需求了。

      但是在這里有一個非常重要的問題沒有解決,就是中文分詞的問題,這些文章中絕大部分都是以英文為背景的,而英文分詞方面,分出單詞很簡單,只需要空格作為分隔符就可以了,而中文中詞與詞之間沒有空格,其次是英文中單復數、過去分詞等比較多,需要還原成單數現在式,但是中文中這個問題基本不存在,再有就是英文需要在分詞后識別長的詞組,而中文這一步也不需進行。

      針對以上這些難題,在我的項目中,采用了MMSeg4j中文分詞模塊,這個項目集成了據說是搜狗輸入法的10萬多詞庫(大家知道中文分詞的關鍵是中文詞庫)。

      另外,我還希望中文分詞可以在全文檢索引擎和全文內容推薦引擎共用,由于全文檢索引擎采用了Apache Lucene 3.x版本,需要中文分詞模塊符合Lucene的體系架構,幸運的是MMSeg4j提供了Lucene所需的Tokenizer實現類,同時還需要重點解決如下問題:

      • 由于打開索引文件比較慢,所以整個程序共享一個indexer和searcher
      • 考慮到準實時性需求,采用了Lucene新版本中reopen機制,每次查詢前讀入索引增量
      • 采用Lucene默鎖機制

      在項目中我定義了全文檢索引擎類:

      public class FteEngine {

        public static void initFteEngine(String _indexPathname) {
          indexPathname = _indexPathname;
        }

        public static FteEngine getInstance() { // Singleton模式
          if (null == engine) {
            engine = new FteEngine();
          }
          return engine;
        }

        public IndexWriter getIndexWriter() {
          return writer;
        }

        public IndexSearcher getIndexSearcher() {
          try {
            IndexReader newReader = reader.reopen(); // 讀入新增加的增量索引內容,滿足實時索引需求
            if (!reader.equals(newReader)) {
              reader.close();
              reader = newReader;
            }
            searcher = new IndexSearcher(reader);
          } catch (CorruptIndexException e) { ....

          } catch (IOException e) {....
          }
          return searcher;
        }

        public Analyzer getAnalyzer() {
          return analyzer;
        }

        public void stop() {
          try {
            if (searcher != null) {
              searcher.close();
            }
            reader.close();
          writer.close();
          indexDir.close();
          } catch (IOException e) {....
          }
        }

        private FteEngine() {
          analyzer = new MMSegAnalyzer(); // 初始化中文分詞模塊,會讀入中文字典
          IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
          iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
          try {
            indexDir = FSDirectory.open(new File(indexPathname));
            writer = new IndexWriter(indexDir, iwc); // writer和reader整個程序共用
            reader = IndexReader.open(writer, true);
          } catch (CorruptIndexException e) {......
          } catch (LockObtainFailedException e) {......
          } catch (IOException e) {.....

          }
        }
        private static FteEngine engine = null;
        private static String indexPathname = null;
        private Directory indexDir = null;
        private IndexWriter writer = null;
        private IndexSearcher searcher = null;
        private Analyzer analyzer = null;
        private IndexReader reader = null;
      }

      具體中文分詞可以使用如下代碼:

      FteEngine fteEngine = FteEngine.getInstance();
      Analyzer analyzer = fteEngine.getAnalyzer();
      String text = "測試2011年如java有意見 分岐其中華人民共合國,oracle咬死獵人的狗!";
      TokenStream tokenStrm = analyzer.tokenStream("contents", new StringReader(text));
      OffsetAttribute offsetAttr = tokenStrm.getAttribute(OffsetAttribute.class);
      CharTermAttribute charTermAttr = tokenStrm.getAttribute(CharTermAttribute.class);
      String term = null;
      int i = 0;
      int len = 0;
      char[] charBuf = null;
      try {
        while (tokenStrm.incrementToken()) {
        charBuf = charTermAttr.buffer();
        for (i = (charBuf.length - 1); i >= 0; i--) {
          if (charBuf[i] > 0) {
            len = i + 1;
            break;
          }
        }
        //term = new String(charBuf, offsetAttr.startOffset(), offsetAttr.endOffset());
        term = new String(charBuf, 0, offsetAttr.endOffset() - offsetAttr.startOffset());
        System.out.println(term);
      }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

      打印的內容如下:

      測試 2011 年 如 java 有 意見 分 岐 其中 華 人民 共 合 國 oracle 咬 死 獵人 的 狗

      當我們在缺省詞庫中加入單詞:分岐 中華人民共合國后,那么分詞結果可以變為:

      測試 2011 年 如 java 有 意見 分岐 其 中華人民共合國 oracle 咬 死 獵人 的 狗

      由此可見,可以通過完善中文詞庫,得到越來越好的中文分詞效果。

      posted on 2011-08-16 11:30  最老程序員閆濤  閱讀(2935)  評論(2)    收藏  舉報

      導航

      主站蜘蛛池模板: 国产精品香蕉在线观看不卡| 亚洲日韩一区精品射精| 欧美丰满熟妇xxxx性| 美女一区二区三区亚洲麻豆| 成人国产精品中文字幕| 欧美成aⅴ人高清免费| 亚洲高清国产自产拍av| 日本一区二区三区视频版| 亚洲国产午夜精品福利| 欧美精欧美乱码一二三四区| 开心久久综合激情五月天| 日本高清视频网站www| 亚洲av永久无码精品天堂久久| 新久久国产色av免费看| 99久久久无码国产精品免费| 精品一二三四区在线观看| 中文字幕日韩有码av| 雷波县| 国产精品视频第一第二区| 国产成人综合95精品视频 | 国产v亚洲v天堂a无码| 人妻少妇精品视频二区| 亚洲精品综合网二三区| 性色av无码久久一区二区三区| 亚洲成片在线看一区二区| 国产精品自在拍首页视频| 亚洲一区中文字幕人妻| 成人无码一区二区三区网站| 免费人成视频在线视频电影| 日韩乱码人妻无码中文字幕视频 | 国产成人a在线观看视频| 韩国无码AV片在线观看网站| 国产一区日韩二区三区| 欧美性猛交xxxx免费看| 国产农村妇女毛片精品久久| 国产精品自拍中文字幕| 精品久久精品久久精品九九| 在线精品自拍亚洲第一区| 亚洲天堂av免费在线看| av在线播放观看国产| 97免费人妻在线视频|