全文搜尋引擎的
進階實作與應用
聖藍科技
執行長
王建興
講者簡介
• 現職
– 聖藍科技執行長
• 興趣
– 網路應用系統開發
• 譯作
– Thinking in Java 4th Edition, 正體中文版
– Thinking in Java 2nd Edition, 正體中文版
– Essential C++, 正體中文版
• 專欄
– iThome 電腦報程式人專欄
• 連絡方式
– qing.chwang at gmail.com
概要
• 前情提要
• Lucene 的相關技術
• 基於搜尋引擎的進階應用
• 文字探勘應用的實作
• 結論
前情提要
• “JAVA 的開放原碼全文搜尋技術- LUCENE” -
2004 年 Java2 專業技術大會
– 全文搜尋引擎的基本概念
– Lucene 的簡介與程式設計
• “「沙中撈金術」﹣談開放原始碼的推薦系
統” - 2012 年 Java2 專業技術大會
– 推薦系統觀念
– 利用 Mahout 實作推薦系統
搜尋引擎的相關技術及應用
• Web Crawler
– 漫爬網頁、取得網頁內容
• 文件格式及語系處理
– 各種格式檔案中語言的偵測及文字的擷取
• 進階搜尋及檢索功能
• 提高服務的規模(例:分散式化)
– 資料量
– 計算量
• 自然語言處理
• 文字探勘(Text Mining)技術
Lucene 的相關技術
• Solr
• Tika
• Nutch
• OpenNLP
• Mahout
Solr
• Solr 是基於 Lucene 的平台,提供了
– 進階的全文搜尋功能
– 搜尋結果標示(Highlighting)
– 分面搜尋(Faceted Search)
– 近乎即時的索引速度
– 標準化的介面(XML, JSON, HTTP)
– 分散式搜尋的能力
Tika
• Tika是個內容分析的工具組,主要提供了
– 內容的偵測(Detector)
• 檔案格式偵測
• 文字語言偵測
– 內容的剖析(Parser)
• Tika 支援格式
– HTML, XML, Office, OpenDocument, PDF, epub, …
Nutch
• Nutch 是個可擴充功能且具規模可擴充性的
Web Crawler
– 基於 Plugin,高度模組化
– 多協定、多執行緒、分散式
– 具規模擴充性的資料處理框架(Hadoop
MapReduce)
– 基於 Lucene 或 Solr 的全文搜尋引擎
漫爬於網頁間
*”Nutch as a Web data mining platform” – abial@slideshare
網頁搜尋引擎組件
*”Nutch as a Web data mining platform” – abial@slideshare
OpenNLP
• NLP 即自然語言處理( Natural Language
Processing)
• OpenNLP 是 Apache 的自然語言處理程式庫
– 句子偵測(Sentence Detector)
– Tokenizer
– 名稱尋找器(Name Finder)
– 文件分類器(Document Categorizer)
– 詞性偵測(Part of Speech)
– ..
基於搜尋引擎的進階應用
• 搜尋引擎為了提供全文搜尋的功能,建立
了文件索引等相關資料
• 現代的搜尋引擎所提供的不只是找出相符
的文件
• 基於文件的索引資料可以開發進階的有趣
應用
進階的搜尋引擎功能實作
• 同音字搜尋
• 同義字搜尋
• 簡繁查詢
基於搜尋引擎的進階應用
• 以文找文
• 關聯詞分析
• 關鍵詞分析
• 文件分類
• 文件群集
在 Lucene 上建多份索引
• 同一份文件進到系統時,可以為它建立多
份索引
• 為什麼需要多份索引?
• 基於不同用途的索引
– bi-gram, tri-gram, n-gram 索引
– 詞庫索引
– 發音索引
– 同義詞索引
做同音字搜尋
• 文件建立索引時,除其餘所需索引外,也
建立同音字查詢時所需的發音索引
• 以中文而言,建立索引時,可取得文件中
每個字的注音符號並建立文件注音符號索
引
• 查詢時,將查詢條件轉換成為注音符號,
針對發音索引做查詢
中文同音字例
• 建立每個中文字的注音對照表
– 載入至 in memory 的 Hash Table 是個簡單的實
作方式
• 建索引時,查表將每個中文字轉換成為注
音
– 黄非紅 -> ㄏㄨㄤˊㄈㄟㄏㄨㄥˊ
• 查詢時一樣查表將查詢字轉換成為注音
– 黄飛鴻-> ㄏㄨㄤˊㄈㄟㄏㄨㄥˊ
• 查詢 “黄飛鴻” 時可同時查出 “黄飛鴻” 及 “
黄非紅”
做同義詞查詢
• 需透過某種方式建立同義詞對應表
– 例如人工維護
– 軟體 -> 軟件
• 建立同義詞索引,提供同義詞查詢
• 簡繁查詢的原理類似
– 可一律建成繁體索引
– 查詢時轉成繁體查詢
詞庫索引
• 何謂 bi-gram, tri-gram, … , n-gram?
• Bi-gram, tri-gram, … , n-gram 的優點
– 不需要倚靠事先建好的詞庫
• 缺點
– 使索引變大降低搜尋效率
– 搜尋出非目標的結果
• 詞庫索引可以視是一種縮小索引內容及範圍的方
式
– 更精準
– 但需要事先建立
Lucene 中內建的中文斷詞器
• ChineseTokenizer
– 將 “我是台灣人” 斷成 “我” “是” “台” “灣” “人”
• CJKTokenizer
– 將 “我是台灣人” 斷成 “我是” “是台” “台灣” “灣
人”
• SmartChineseAnalyzer
– 將 “我是台灣人” 斷成 “我” “是” “台灣” “人”
其他的中文斷詞器
• Paoding(庖丁解牛)
• Imdict-Chinese-Analyzer:imdict 智慧型詞典
所用的智慧型中文斷詞器
• IKAnalyzer
• Mmseg4j: 利用蔡志浩教授的 MMSeg 演算法
開發出來的詞斷器
文字探勘(Text Mining)
• 文字探勘意指從文字資訊中發掘出有用資
訊的程序
• Data Mining vs. Text Mining
– Data Mining 假設處理的資料為具結構的資料
– Text Mining 的資源輸入為自然語言型式的文件
資料
• Text Mining 可先將自然語言型式的文件資料
轉換成為具結構的資料,再套用 Data
Mining 方法處理
生活中到處都是文字應用
• 部落格文章
• 社交網站的近況更新
– Facebook
– Twitter
• YouTube 影片的文字描述
• 歌曲的專輯、歌手、曲名
• 購物網站上的商品名稱、文字描述
• …
文字探勘的應用例子
• 部落格/新聞/文章
– 相似的部落格/新聞/文章
– 相關的部落格/新聞/文章(See Also)
– 某個使用者可能會感興趣的部落格/新聞/文章
– 部落格/新聞/文章自動分類(應用:適合投放的廣
告)
• Facebook/Twitter 近況更新
– 流行主題分析
– 口碑分析
– 使用者偏好分析
– 廣告投放
– 推薦興趣相同的使用者
– 推薦投其所好的社團
新聞網站應用文字探勘
*http://http://times.hinet.net/
以搜尋引擎為基礎如何協助探勘文字
• 文字探勘的首要工作為將自然語言型式的文件轉
成結構化的資訊
• 轉換成為結構化的資訊後,即可運用資料探勘的
技術處理
• 搜尋引擎在建立索引的同時,即在將自然語言型
式的文件轉成結構化的資訊
文件的相似性
• 文件的相似性是許多基於搜尋引擎的進階
應用的基礎
– 搜尋引擎的主要功能即尋找與查詢字串相似的
文件
• 如何判斷文件的相似性?
– 將文字內容轉換成為可以數學處理的型式,即
向量
– 利用向量的相似度來判斷文件的相似性
Vector Space Model (1/2)
• 每份文件中所含的詞,都是一個特徵
• 將每份文件轉成所有詞所構成之向量空間
中的向量
• 將文件轉換成為向量後即可處理文件的相
似度
Vector Space Model (2/2)
• 將文件表示為 n 維的向量
– n 即所有文字中的所有可能詞
– 若一文件被表示為向量 V,其中的第 i 個元素之
為 v(i) ,其值為詞 wi 的權重
– 詞 wi 的權重可以有不同的表示,例如
• 詞 wi 的出現次數
• 詞 wi 的 TF-IDF 值
向量相似度
TF-IDF
• Term Frequency – Inverse Document Frequency
• TF
– 詞在文件中出現的頻率
– 衡量特定詞在單一文件中的重要性
• IDF
– log( 總文件數/ (t 這個詞出現的文件總數) )
– 衡量特定詞所含的資訊重要程度
Term Frequency Vector
• 利用 Lucene 建立索引,可取得文件的
“Term Vector”
• 所謂的 “Term Vector” 即將文件轉為向量空
間中的向量形式
取得 TF, IDF 資訊的初始動作
*http://filotechnologia.blogspot.tw/2013/11/get-tf-and-idf-of-all-terms-of-index.html
• 開啟 IndexReader
• 建立 TFIDFSimilarity 類別的 instance
取得 IDF
已可取得 TF-IDF 向量
下一步?
Apache Mahout
• Apache Mahout™ 是個具規模可擴充性的機器學習
(machine learning)程式庫
• Mahout在Apache Hadoop ™ 上,使用了
map/reduce的演算法,實作了 clustering,
classification, 以及 collaborative filtering的核心演算
法
• 除了跑在分散式/雲端多節點的Hadoop平台上之外
,其中也提了單一節點以及非Hadoop的實作版本
• 其核心程式庫即使是非分散式的版本,也都經高
度最佳化因而能提供極佳的效能
Mahout 提供的諸般演算法
• 推薦引擎
– 指協同過濾式(Collaborative Filtering)推薦
• 分類演算法
– Bayesian, Support Vector Machine (SVM), Neural Network,
Hidden Markov Models, …
• 群集演算法
– K-Means, Fuzzy K-Means, Hierarchical Clustering, …
• Pattern Mining
– 頻繁項目集(Frequent Itemset)演算法
• Regression
• Dimension Reduction
– Singular Value Decomposition and other Dimension Reduction Techniques
• Vector Similarity
透過 Lucene 取得文件的 TF-IDF 向量後
利用 Mahout 中所提供
的程式庫做計算及應用
如何計算相似度
• Mahout 中提供了計算向量相似度的程式
– Cosine Similarity
– Pearson Correlation Similarity
– Euclidian Distance Similarity
– Tanimoto Coefficient Similarity
– Log Likelyhood Similarity
文件的自動分類 (1/2)
• 利用現有的文件分類結果,將未知類型的
新文件自動分類
– 新聞的自動分類(政治、財經、運動、娛樂)
– 網頁的自動分類(3C, 美妝, 政治, 電玩, … )
• 自動分類屬於監督式(supervised)學習
文件的自動分類(2/2)
• 取得文件的向量表示式後,可套用典型的
分類演算法來做文件的分類
• Mahout 提供了各種分類演算法
– Stochastic Gradient Decent
– Support Vector Machine
– Naïve Bayes
– Complementary Naïve Bayes
– Random Forrest
– …
文件自動分群(1/2)
• 基於文件的特性,自動的將相關的文件集
結成群,並且找出該群文件的共通特性
– 共通特性像是共同的關鍵字
• 自動分群可以是非監督式(non-supervised)
學習
文件自動分群(2/2)
• 取得文件的 Vector 後,將 vector 套入
Mahout 的自動分群演算法,即可達到文件
的自動分群
– K-Means
– Fuzzy K-Means
– Meanshift
– Centroid Generation
– Direchlet Clustering
文件自動分群
*http://www.ediscoverydaily.com/2011/11/ediscovery-best-practices-cluster-documents-for-more-effective-review.html
關聯詞分析 (1/2)
• 關聯詞代表相關性高的字詞,出現詞 A 時,
有很高的機會出現詞 B,則說 A 與 B 為關聯
詞
• 關聯詞的分析有助於我們從大量文件中發
掘出概念的關聯性
關聯詞分析 (2/2)
• 關聯詞即共同出現機率高的詞
• 利用 Item-based 的 CF 方法可分析關聯詞
• 先取得文件的 Term Vector,再運用 Mahout
的 ItemBasedRecommender 即可進行分析
關鍵詞及文字屬性
• 一篇文章中的關鍵詞
– 基本上是其中 TF-IDF 分數較高者
• 為使用者或商品標示關鍵詞
– 使用者瀏覽或按讚某文章,則該文章的關鍵詞
有可能是該使用者的偏好
– 文字是一個偏好的不錯的表示方式
– 點看商品細節、加入購物車、結帳 ... 都可從商
品的文字關鍵詞中推論使用者的偏好
使用者的偏好文字
• 依使用者偏好的文字特性可做
– 使用者的自動分群
– 使用者的自動分類
• 使用者偏好可做許多應用
– 相似的使用者(朋友推薦)
– 會感興趣的商品(使用者偏好文字和商品文字
相似)
– 廣告投放(使用者偏好文字和正在瀏覽的網頁
文字相似)
處理海量的文件
• 在過去,要做文字探勘的應用,得自行開
發許多程式
– 轉換成向量(現在有 Lucene 了)
– 資料探勘的演算法實作(現在有 Mahout 了)
• 而在這 Big Data 的時代,還可能要處理海量
的文件資料
– 幸好,Mahout 基於 Hadoop 的 map-reduce 提供
了好的規模可擴充性
更幸運的是 …
Mahout 內建支援
Lucene 的整合
將 Lucene 索引轉換成 Mahout 向量
• Mahout 內建支援將 Lucene & Solr 索引轉換成為
Mahout 標準向量格式的工具程式
• $MAHOUT_HOME/bin/mahout lucene.vector
--dir $WORK_DIR/wikipedia/solr/data/index
--field body
--dictOut $WORK_DIR/solr/wikipedia/dict.txt
--output $WORK_DIR/solr/wikipedia/out.txt
• 除了 Lucene 索引外,Mahout 也支援將文件轉換
成為 SequenceFile 格式,再將 SequenceFile 格式檔
案轉換成為向量
Mahout 對文字資料的支援
• 將文件資料轉換為向量時,可套用 TF-IDF
• 可自訂斷詞器
• Mahout 也允許你撰寫程式呼叫 API 來處理
文件資料
有了 Mahout 向量之外
• 即可套用 Mahout 現成的演算方法來處理向
量
– 文件群集
– 文件分類
– …
• 基於 Hadoop,可擴展處理更規模的文件資
料量
結語
• 搜尋引擎所建立的資料,不僅可供搜尋文
件之用,還可提供更多進階的應用可能
• 過去,要處理文字的 mining 需要許多輪子
• 如今,輪子都有了
– Lucene 的相關技術及平台
• 而且,還上了雲端
– 更容易處理規模可擴充性的問題
資源
• Solr
– lucene.apache.org/solr
• Nutch
– nutch.apache.org
• Tika
– tika.apache.org
• OpenNLP
– opennlp.apache.org
• Mahout
– mahout.apache.org
謝謝

全文搜尋引擎的進階實作與應用