1. ES(六) ElasticSearch搜索原理
關於ES的搜索,小白暫且簡單的歸納如下:
新增文檔時涉及分詞、構建索引
查詢時涉及分詞、查詢索引、相關度評分
那麼接下來,小白就從分詞、索引、相關度評分三個方面開始瞎掰了...
指余 分詞是指將文本轉換成一系列單詞(term or token)的過程,也可以叫做文本分析,在es裡面稱為Analysis。
分詞機制:
Character Filter:對原始文本進行處理,例如 去除html標簽、替換字元等
Tokenizer:將原始文本進行分詞,例如 小白最帥 => 小白,最,帥
Token Filters:分詞後的關鍵字進行加工,例如 轉小寫、刪除語氣詞、近義詞和同義詞等
在進行Tokenizer之前對對原始文本進行處理如睜,例如 去除html標簽、替換字元等
不過進行處理後,會影響後續Tokenizer解析的position和offset
HTML Strip => 去除html標簽和轉換html實體
Mapping => 字元串替換操作
Pattern Replace => 正則匹配替換
將原始文本進行分詞,例如 小白最帥 => 小白,最,帥
Elasticsearch自帶的分詞器:
【分詞器(Analyzer)】 【特點】
standard(es默認) 支持多語言,按詞切分並做小寫處理
simple 按照非字母切分,小寫處理
whitespace 按照空格來切分
stop 去除語氣助詞,如the、an、的、這等
keyword 不分詞
pattern 渣逗歲 正則分詞,默認\w+,即非字詞符號做分割符
language 常見語言的分詞器(30+)
常見中文分詞器:
【名稱】 【介紹】 【特點】
IK 實現中英文單詞切分 自定義詞庫
https://github.com/medcl/elasticsearch-analysis-ik
Jieba python流行分詞系統,支持分詞和詞性標注 支持繁體、自定義、並行分詞
http://github.com/sing1ee/elasticsearch-jieba-plugin
Hanlp 由一系列模型於演算法組成的java工具包 普及自然語言處理在生產中應用
https://github.com/hankcs/HanLP
THULAC 清華大學中文詞法分析工具包 具有中文分詞和詞性標注功能
https://github.com/microbun/elasticsearch-thulac-plugin
分詞後的關鍵字進行加工,例如 轉小寫、刪除語氣詞、近義詞和同義詞等
lowercase => 將所有term轉換為小寫
stop => 刪除stop words
ngram => 和Edge NGram連詞分割
synonym => 添加近義詞的term
提到ES中的索引,就算沒用過,估計也聽過,就是倒排索引,當然ES中不可能不涉及正排索引。
通俗地來講,正排索引是通過key找value,倒排索引則是通過value找key。舉個例子,如果要查找圖書館中名為【水滸傳】的書籍時,提前建立正排索引會提高查詢效率;如果要查找圖書館中所有包含詞語【英雄】的書籍時,提前建立倒排索引會提高查詢效率,而正排索引需要遍歷所有的書籍內容。
記錄文檔id到文檔內容or單詞的關聯關系,比如:
【DocId】 【content】
1 => 小白最帥(小白、最、帥)
2 => 小黑最帥(小黑、最、帥)
3 => 拳打小白(拳打、小白)
備註:IK分詞器中提供了兩個分詞演算法 ik_smart 和 ik_max_word
其中 ik_smart 為最少切分,ik_max_word為最細粒度劃分
本小節分詞採用的是 ik_smart
記錄單詞到文檔id的關聯關系,包含:
1、Term DicTionary(單詞詞典):記錄所有文檔的單詞,一般比較大
2、Posting List(倒排鏈表):記錄單詞倒排列表的關聯信息
以第1節中文檔【小白最帥】和【拳打小白】中的【小白】為例:
Term DicTionary:小白
Posting List:
【DocId】 【TF】 【Position】 【Offset】
1 1 0 <0-2>
3 1 1 <2-4>
DocId:文檔id,指向文檔的原始信息
TF:單詞頻率,記錄該詞在文檔中出現的次數,用於後續相關性評分
Position:位置,記錄文檔中欄位分詞後,單詞所在的位置,從0開始
Offset:偏移量,記錄單詞在文檔中開始和結束位置,用於高亮顯示等,從0開始
不是很恰當的說,索引的建立,標志著key的創建,再讓key和value之間建立聯系,就可以讓原本直接查找value,變成了先去查找key,再直接定位到對應的value,屬於典型的空間換時間或者說是先栽樹、再乘涼。
下面這個數據結構圖,不管是java開發還是大數據開發,估計都看爛了。。。
備註:每個文檔欄位都有自己的倒排索引
相關性描述的是「語句」與「某個文檔」匹配的程度。ES 會對每個匹配查詢的結果進⾏計算,得出_score,_score 的評分越高,相關度就越高,那這個計算就需要一個演算法。在ES5之前默認的演算法是TF/IDF,ES5之後默認採用的是BM25,BM25是對TF/IDF的改進,所以這里小白直接以BM25為主來叨叨。
在進行相關度計算之前,會先有一個過程叫Boolean Model,之後再使用TFNORM/IDF演算法。
簡單來說,Boolean Model就是根據查詢條件,對文檔進行一個快速的篩選,不涉及相關度計算。
即詞頻長度(Term Frequency Norm),單個term在文檔中出現的頻率,並結合欄位長度,出現次數越高,欄位長度越低,分越高
計算公式:
tfNorm(t in d) = (freq * (k1 + 1)) / (freq + k1 * (1 - b + b * fieldLength / avgFieldLength))
freq:term出現頻率
k1 :這個參數控制著詞頻結果在詞頻飽和度中的上升速度 。 默認值為1.2。值越小飽和度變化越快,值越大飽和度變化越慢
b :這個參數控制著欄位長歸一值所起的作用 , 0.0會禁用歸一化,1.0會啟用完全歸一化。默認值為0.75
fieldLength:欄位長度
avgFieldLength:平均欄位長度
即逆向文檔頻率(inversed document frequency),單個term在所有文檔里出現的頻率,出現次數越高,分越低。
計算公式:
idf(t) = log(1 + (docCount - docFreq + 0.5) / (docFreq + 0.5))
docCount :索引中文檔數量
docFreq :包含該詞的文檔數
此公式將出現頻率較高的詞的得分降低。比如,「的」、「了」等詞語在各文檔中出現頻率較高,但是並沒有太大的參考意義,所以降低其得分。
然後,將上面兩個演算法的得分相乘,則是一個term的最終得分。
單個term:_score(單) = idf(t) * tfNorm(t in d)
多個term:_score(多) = 多個_score(單)的和
最後,我們在Kibana中通過explain查詢語句來看一哈【所用索引和數據為下一節中的內容】:
ES(五) ElasticSearch+Kibana+IK 安裝—ES集群 ES(七) Demo-商品搜索
2. python ngram 怎麼用
在橡弊自然語言里有一個模型叫做n-gram,表示文字或語言中的n個連梁耐族續的單片語成序列。在進行自然語言分析時,使用n-gram或者尋畝告找常用片語,可以很容易的把一句話分解成若干個文字片段。
3. 我在python下運行一個perl程序,但是報錯,說沒有許可權
這種情況一般發生在帆轎唯windows圖形界面下,雙擊執行程序後,DOS窗口運行完畢自動就關閉了。帆蔽
解決辦法:
1 你在程序最後加上system(「pause」), 這個調試方法改變了程序本身,不推薦。
2 你進入dos命令行,找到perl腳本所在目錄,然後敲 perl <腳本名> 來執行。
3 如果你裝有gvim,可以用gvim來打開perl腳本,然後敲 :!perl <腳本名> 來執行,態培 我通常用這種方法。
4. Lucene實戰的目錄
目錄
第1部分Lucene核心
第1章初識Lucene 3
1.1應對信息爆炸 4
1.2Lucene是什麼 5
1.2.1Lucene能做些什麼 6
1.2.2Lucene的歷史 7
1.3Lucene和搜索程序組件 9
1.3.1索引組件 10
1.3.2搜索組件 13
1.3.3搜索程序的其他模塊 16
1.3.4Lucene與應用程序的整合點 18
1.4Lucene實戰:程序示例 18
1.4.1建立索引 19
1.4.2搜索索引 22
1.5理解索引過程的核心類 25
1.5.1IndexWriter 25
1.5.2Directory 25
1.5.3Analyzer 26
1.5.4Document 26
1.5.5Field 27
1.6理解搜索過程的核心類 27
1.6.1IndexSearcher 27
1.6.2Term 28
1.6.3Query 28
1.6.4TermQuery 28
1.6.5TopDocs 29
1.7小結 29
第2章構建索引30
2.1Lucene如何對搜索內容進行建模 31
2.1.1文檔和域 31
2.1.2靈活的架構 32
2.1.3反向規格化(Denormalization) 32
2.2理解索引過程 33
2.2.1提取文本和創建文檔 33
2.2.2分析文檔 34
2.2.3向索引添加文檔 34
2.3基本索引操作 35
2.3.1向索引添加文檔 35
2.3.2刪除索引中的文檔 38
2.3.3更新索引中的文檔 39
2.4域選項 41
2.4.1域索引選項 41
2.4.2域存儲選項 42
2.4.3域的項向量選項 42
2.4.4Reader、TokenStream和byte[ ]域值 42
2.4.5域選項組合 43
2.4.6域排序選項 44
2.4.7多值域 44
2.5對文檔和域進行加權操作 45
2.5.1文檔加權操作 45
2.5.2域加權操作 46
2.5.3加權基準(Norms) 47
2.6索引數字、日期和時間 48
2.6.1索引數字 48
2.6.2索引日期和時間 49
2.7域截取(Field truncation) 50
2.8近實時搜索(Near-real-time search) 51
2.9優化索引 51
2.10其他Directory子類 52
2.11並發、線程安全及鎖機制 55
2.11.1線程安全和多虛擬機安全 55
2.11.2通過遠程文件系統訪問索引 56
2.11.3索引鎖機制 57
2.12調試索引 59
2.13高級索引概念 60
2.13.1用IndexReader刪除文檔 61
2.13.2回收被刪除文檔所使用過的磁碟空間 62
2.13.3緩沖和刷新 62
2.13.4索引提交 63
2.13.5ACID事務和索引連續性 65
2.13.6合並段 66
2.14小結 68
第3章為應用程序添加搜索功能70
3.1實現簡單的搜索功能 71
3.1.1對特定項的搜索 72
3.1.2解析用戶輸入的查詢表達式:QueryParser 73
3.2使用IndexSearcher類 76
3.2.1創建IndexSearcher類 76
3.2.2實現搜索功能 78
3.2.3使用TopDocs類 78
3.2.4搜索結果分頁 79
3.2.5近實時搜索 79
3.3理解Lucene的評分機制 81
3.3.1Lucene如何評分 81
3.3.2使用explain()理解搜索結果評分 83
3.4Lucene的多樣化查詢 84
3.4.1通過項進行搜索:TermQuery類 85
3.4.2在指定的項范圍內搜索:TermRangeQuery類 86
3.4.3在指定的數字范圍內搜索:NumericRangeQuery類 87
3.4.4通過字元串搜索:PrefixQuery類 88
3.4.5組合查詢:BooleanQuery類 88
3.4.6通過短語搜索:PhraseQuery類 91
3.4.7通配符查詢:WildcardQuery類 93
3.4.8搜索類似項:FuzzyQuery類 94
3.4.9匹配所有文檔:MatchAllDocsQuery類 95
3.5解析查詢表達式:QueryParser 96
3.5.1Query.toString方法 97
3.5.2TermQuery 97
3.5.3項范圍查詢 98
3.5.4數值范圍搜索和日期范圍搜索 99
3.5.5前綴查詢和通配符查詢 99
3.5.6布爾操作符 100
3.5.7短語查詢 100
3.5.8模糊查詢 101
3.5.9MatchAllDocsQuery 102
3.5.10分組查詢 102
3.5.11域選擇 103
3.5.12為子查詢設置加權 103
3.5.13是否一定要使用QueryParse 103
3.6小結 104
第4章Lucene的分析過程 105
4.1使用分析器 106
4.1.1索引過程中的分析 107
4.1.2QueryParser分析 109
4.1.3解析vs分析:分析器何時不再適用 109
4.2剖析分析器 110
4.2.1語匯單元的組成 111
4.2.2語匯單元流揭秘 112
4.2.3觀察分析器 115
4.2.4語匯單元過濾器:過濾順序的重要性 119
4.3使用內置分析器 121
4.3.1StopAnalyzer 122
4.3.2StandardAnalyzer 122
4.3.3應當採用哪種核心分析器 123
4.4近音詞查詢 123
4.5同義詞、別名和其他表示相同意義的詞 126
4.5.1創建SynonymAnalyzer 127
4.5.2顯示語匯單元的位置 131
4.6詞干分析 132
4.6.1StopFilter保留空位 133
4.6.2合並詞干操作和停用詞移除操作 134
4.7域分析 134
4.7.1多值域分析 135
4.7.2特定域分析 135
4.7.3搜索未被分析的域 136
4.8語言分析 139
4.8.1Unicode與字元編碼 139
4.8.2非英語語種分析 140
4.8.3字元規范化處理 140
4.8.4亞洲語種分析 141
4.8.5有關非英語語種分析的其他問題 143
4.9Nutch分析 144
4.10小結 146
第5章高級搜索技術147
5.1Lucene域緩存 148
5.1.1為所有文檔載入域值 149
5.1.2段對應的reader 149
5.2對搜索結果進行排序 150
5.2.1根據域值進行排序 150
5.2.2按照相關性進行排序 153
5.2.3按照索引順序進行排序 154
5.2.4通過域進行排序 154
5.2.5倒排序 155
5.2.6通過多個域進行排序 156
5.2.7為排序域選擇類型 157
5.2.8使用非默認的locale方式進行排序 157
5.3使用MultiPhraseQuery 158
5.4針對多個域的一次性查詢 160
5.5跨度查詢 162
5.5.1跨度查詢的構建模塊:SpanTermQuery 165
5.5.2在域的起點查找跨度 166
5.5.3彼此相鄰的跨度 167
5.5.4在匹配結果中排除重疊的跨度 169
5.5.5SpanOrQuery類 170
5.5.6SpanQuery類和QueryParser類 171
5.6搜索過濾 172
5.6.1TermRangeFilter 173
5.6.2NumericRangeFilter 174
5.6.3FieldCacheRangeFilter 174
5.6.4特定項過濾 174
5.6.5使用QueryWrapperFilter類 175
5.6.6使用SpanQueryFilter類 175
5.6.7安全過濾器 176
5.6.8使用BooleanQuery類進行過濾 177
5.6.9PrefixFilter 178
5.6.10緩存過濾結果 178
5.6.11將filter封裝成query 179
5.6.12對過濾器進行過濾 179
5.6.13非Lucene內置的過濾器 180
5.7使用功能查詢實現自定義評分 180
5.7.1功能查詢的相關類 180
5.7.2使用功能查詢對最近修改過的文檔進行加權 182
5.8針對多索引的搜索 184
5.8.1使用MultiSearch類 184
5.8.2使用ParallelMultiSearcher進行多線程搜索 186
5.9使用項向量 186
5.9.1查找相似書籍 187
5.9.2它屬於哪個類別 190
5.9.3TermVectorMapper類 193
5.10使用FieldSelector載入域 194
5.11停止較慢的搜索 195
5.12小結 196
第6章擴展搜索198
6.1使用自定義排序方法 199
6.1.1針對地理位置排序方式進行文檔索引 199
6.1.2實現自定義的地理位置排序方式 200
6.1.3訪問自定義排序中的值 203
6.2開發自定義的Collector 204
6.2.1Collector基類 205
6.2.2自定義Collector:BookLinkCollector 206
6.2.3AllDocCollector類 207
6.3擴展QueryParser類 208
6.3.1自定義QueryParser的行為 208
6.3.2禁用模糊查詢和通配符查詢 209
6.3.3處理數值域的范圍查詢 210
6.3.4處理日期范圍 211
6.3.5對已排序短語進行查詢 213
6.4自定義過濾器 215
6.4.1實現自定義過濾器 215
6.4.2搜索期間使用自定義過濾器 216
6.4.3另一種選擇:FilterQuery類 217
6.5有效載荷(Payloads) 218
6.5.1分析期間生成有效載荷 219
6.5.2搜索期間使用有效載荷 220
6.5.3有效載荷和跨度查詢 223
6.5.4通過TermPositions來檢索有效載荷 223
6.6小結 223
第2部分Lucene應用
第7章使用Tika提取文本227
7.1Tika是什麼 228
7.2Tika的邏輯設計和API 230
7.3安裝Tika 231
7.4Tika的內置文本提取工具 232
7.5編程實現文本提取 234
7.5.1索引Lucene文檔 234
7.5.2Tika工具類 237
7.5.3選擇自定義分析器 238
7.6Tika的局限 238
7.7索引自定義的XML文件 239
7.7.1使用SAX進行解析 239
7.7.2使用Apache Commons Digester進行解析和索引 242
7.8其他選擇 244
7.9小結 245
第8章Lucene基本擴展246
8.1Luke:Lucene的索引工具箱 247
8.1.1Overview標簽頁:索引的全局視圖 248
8.1.2瀏覽文檔 249
8.1.3使用QueryParser進行搜索 251
8.1.4Files and Plugins標簽頁 252
8.2分析器、語匯單元器和語匯單元過濾器 253
8.2.1SnowballAnalyzer 255
8.2.2Ngram過濾器 256
8.2.3Shingle過濾器 258
8.2.4獲取捐贈分析器 258
8.3高亮顯示查詢項 259
8.3.1高亮顯示模塊 259
8.3.2獨立的高亮顯示示例 262
8.3.3使用CSS進行高亮顯示處理 263
8.3.4高亮顯示搜索結果 264
8.4FastVector Highlighter類 266
8.5拼寫檢查 269
8.5.1生成提示列表 269
8.5.2選擇最佳提示 271
8.5.3向用戶展示搜索結果 272
8.5.4一些加強拼寫檢查的考慮 273
8.6引人注目的查詢擴展功能 274
8.6.1MoreLikeThis 274
8.6.2FuzzyLikeThisQuery 275
8.6.3BoostingQuery 275
8.6.4TermsFilter 276
8.6.5DuplicateFilter 276
8.6.6RegexQuery 276
8.7構建軟體捐贈模塊(contrib mole) 277
8.7.1源代碼獲取方式 277
8.7.2contrib目錄的Ant插件 277
8.8小結 278
第9章Lucene高級擴展279
9.1鏈式過濾器 280
9.2使用Berkeley DB存儲索引 282
9.3WordNet同義詞 284
9.3.1建立同義詞索引 285
9.3.2將WordNet同義詞鏈接到分析器中 287
9.4基於內存的快速索引 289
9.5XML QueryParser:超出「one box」的搜索介面 289
9.5.1使用XmlQueryParser 291
9.5.2擴展XML查詢語法 295
9.6外圍查詢語言 296
9.7Spatial Lucene 298
9.7.1索引空間數據 299
9.7.2搜索空間數據 302
9.7.3Spatial Lucene的性能特點 304
9.8遠程進行多索引搜索 306
9.9靈活的QueryParser 309
9.10其他內容 312
9.11小結 313
第10章其他編程語言使用Lucene314
10.1移植入門 315
10.1.1移植取捨 316
10.1.2選擇合適的移植版本 317
10.2CLucene(C++) 317
10.2.1移植目的 318
10.2.2API和索引兼容 319
10.2.3支持的平台 321
10.2.4當前情況以及未來展望 321
10.3Lucene-Net(C#和其他.NET編程語言) 321
10.3.1API兼容 323
10.3.2索引兼容 324
10.4KinoSearch和Lucy(Perl) 324
10.4.1KinoSearch 325
10.4.2Lucy 327
10.4.3其他Perl選項 327
10.5Ferret(Ruby) 328
10.6php 329
10.6.1Zend Framework 329
10.6.2PHP Bridge 330
10.7PyLucene(Python) 330
10.7.1API兼容 332
10.7.2其他Python選項 332
10.8Solr(包含多種編程語言) 332
10.9小結 334
第11章Lucene管理和性能調優335
11.1性能調優 336
11.1.1簡單的性能調優步驟 337
11.1.2測試方法 338
11.1.3索引-搜索時延調優 339
11.1.4索引操作吞吐量調優 340
11.1.5搜索時延和搜索吞吐量調優 344
11.2多線程和並行處理 346
11.2.1使用多線程進行索引操作 347
11.2.2使用多線程進行搜索操作 351
11.3資源消耗管理 354
11.3.1磁碟空間管理 354
11.3.2文件描述符管理 357
11.3.3內存管理 361
11.4熱備份索引 364
11.4.1創建索引備份 365
11.4.2恢復索引 366
11.5常見錯誤 367
11.5.1索引損壞 367
11.5.2修復索引 369
11.6小結 369
第3部分案例分析
第12章案例分析1:Krugle373
12.1Krugle介紹 374
12.2應用架構 375
12.3搜索性能 376
12.4源代碼解析 377
12.5子串搜索 378
12.6查詢VS搜索 381
12.7改進空間 382
12.7.1FieldCache內存使用 382
12.7.2合並索引 382
12.8小結 383
第13章案例分析2:SIREn384
13.1SIREn介紹 385
13.2SIREn優勢 385
13.2.1通過所有域進行搜索 387
13.2.2一種高效詞典 388
13.2.3可變域 388
13.2.4對多值域的高效處理 388
13.3使用SIREn索引實體 388
13.3.1數據模型 389
13.3.2實現問題 389
13.3.3索引概要 390
13.3.4索引前的數據准備 390
13.4使用SIREn搜索實體 392
13.4.1搜索內容 392
13.4.2根據單元限制搜索范圍 393
13.4.3將單元合並成元組 393
13.4.4針對實體描述進行查詢 394
13.5在Solr中集成SIREn 394
13.6Benchmark 395
13.7小結 397
第14章案例分析3:LinkedIn398
14.1使用Bobo Browse進行分組搜索 398
14.1.1Bobo Browse的設計 400
14.1.2深層次分組搜索 403
14.2使用Zoie進行實時搜索 405
14.2.1Zoie架構 406
14.2.2實時VS近實時 409
14.2.3文檔與索引請求 411
14.2.4自定義IndexReaders 411
14.2.5與Lucene的近實時搜索進行比較 412
14.2.6分布式搜索 413
14.3小結 415
附錄A安裝Lucene416
A.1二進制文件安裝 416
A.2運行命令行演示程序 417
A.3運行Web應用演示程序 418
A.4編譯源代碼 419
A.5排錯 420
附錄BLucene索引格式421
B.1邏輯索引視圖 421
B.2關於索引結構 422
B.2.1理解多文件索引結構 422
B.2.2理解復合索引結構 425
B.2.3轉換索引結構 426
B.3倒排索引 427
B.4小結 430
附錄CLucene/contrib benchmark431
C.1運行測試腳本 432
C.2測試腳本的組成部分 435
C.2.1內容源和文檔生成器 438
C.2.2查詢生成器 439
C.3控制結構 439
C.4內置任務 441
C.4.1建立和使用行文件 445
C.4.2內置報表任務 446
C.5評估搜索質量 446
C.6出錯處理 449
C.7小結 449
附錄D資源450
D.1Lucene知識庫 450
D.2國際化 450
D.3語言探測 451
D.4項向量 451
D.5Lucene移植版本 451
D.6案例分析 452
D.7其他 452
D.8信息檢索軟體 452
D.9Doug Cutting的著作 453
D.9.1會議論文 453
D.9.2美國專利 454
5. R語言中的情感分析與機器學習
來源 | 雪晴數據網
利用機器學習可以很方便的做情感分析。本篇文章將介紹在R語言中如何利用機器學習方法來做情感分析。在R語言中,由Timothy P.Jurka開發的情感分析以及更一般的文本挖掘包已經得到了很好的發展。你可以查看下sentiment包以及夢幻般的RTextTools包。實際上,Timothy還寫了一個針對低內存下多元Logistic回歸(也稱最大熵)的R包maxtent。
然而,RTextTools包中不包含樸素貝葉斯方法。e1071包可以很好的執行樸素貝葉斯方法。e1071是TU Wien(維也納科技大學)統計系的一門課程。這個包的主要開發者是David Meyer。
我們仍然有必要了解文本分析方面的知識。用R語言來處理文本分析已經是公認的事實(詳見R語言中的自然語言處理)。tm包算是其中成功的一部分:它是R語言在文本挖掘應用中的一個框架。它在文本清洗(詞干提取,刪除停用詞等)以及將文本轉換為詞條-文檔矩陣(dtm)方面做得很好。這里是對它的一個介紹。文本分析最重要的部分就是得到每個文檔的特徵向量,其中詞語特徵最重要的。當然,你也可以將單個詞語特徵擴展為雙片語,三連詞,n-連詞等。在本篇文章,我們以單個詞語特徵為例做演示。
注意,在R中用ngram包來處理n-連詞。在過去,Rweka包提供了函數來處理它,感興趣的可以查看這個案例。現在,你可以設置RTextTools包中create_matrix函數的參數ngramLength來實現它。
第一步是讀取數據:
創建詞條-文檔矩陣:
現在,我們可以用這個數據集來訓練樸素貝葉斯模型。注意,e1071要求響應變數是數值型或因子型的。我們用下面的方法將字元串型數據轉換成因子型:
測試結果准確度:
顯然,這個結果跟python得到的結果是相同的(這篇文章是用python得到的結果)。
其它機器學習方法怎樣呢?
下面我們使用RTextTools包來處理它。
首先,指定相應的數據:
其次,用多種機器學習演算法訓練模型:
現在,我們可以使用訓練過的模型做測試集分類:
准確性如何呢?
得到模型的結果摘要(特別是結果的有效性):
結果的交叉驗證:
結果可在我的Rpub頁面找到。可以看到,maxent的准確性跟樸素貝葉斯是一樣的,其它方法的結果准確性更差。這是可以理解的,因為我們給的是一個非常小的數據集。擴大訓練集後,利用更復雜的方法我們對推文做的情感分析可以得到一個更好的結果。示例演示如下:
推文情感分析
數據來自victornep。victorneo展示的是用python對推文做情感分析。這里,我們用R來處理它:
讀取數據:
首先,嘗試下樸素貝葉斯
然後,嘗試其他方法:
這里,我們也希望得到正式的測試結果。包括:
1.analytics@algorithm_summary:包括精確度,召回率,准確率,F-scores的摘要
2.analytics@label_summary:類標簽摘要
3.analytics@document_summary:所有數據和得分的原摘要
4.analytics@ensemble_summary:所有 精確度/覆蓋度 比值的摘要
現在讓我們看看結果:
與樸素貝葉斯方法相比,其它演算法的結果更好,召回精度高於0.95。結果可在Rpub查看
原文鏈接:http://www.xueqing.cc/cms/article/107
6. Python編程實現csv文件某一列的詞頻統計
如果是用戶輸入關鍵詞,計算關鍵詞的詞頻。這個好做,如果是要程序自己分析詞來做詞頻統計,這個非常難。
7. 電腦-Sphinx在windows下安裝使用[支持中文全文檢索]
前一陣子嘗試使用了一下Sphinx,一個能夠被各種語言(PHP/Python/Ruby/etc)方便調用的全文檢索系統。網上的資料大多是在linux環境下的安裝使用,當然,作為生產環境很有必要部署在*nix環境下,作為學習測試,還是windows環境比較方便些。
本文旨在提供一種便捷的方式讓Sphinx在windows下安裝配置以支持中文全文檢索,配置部分在linux下通用。
一、關於Sphinx
Sphinx 是一個在GPLv2 下發布的一個全文檢索引擎,商業授權(例如, 嵌入到其他程序中)需要聯系作者(Sphinxsearch.com)以獲得商業授權。
一般而言,Sphinx是一個獨立的搜索引擎,意圖為其他應用提供高速、低空間佔用、高結果相關度的全文搜索功能。Sphinx可以非常容易的與SQL資料庫和腳本語言集成。
當前系統內置MySQL和PostgreSQL 資料庫數據源的支持,也支持從標准輸入讀取特定格式的XML數據。通過修改源代碼,用戶可以自行增加新的數據源(例如:其他類型的DBMS的原生支持)。
搜索API支持PHP、Python、Perl、Rudy和Java,並且也可以用作MySQL存儲引擎。搜索API非常簡單,可以在若干個小時之內移植到新的語言上。
Sphinx特性:
高速的建立索引(在當代CPU上,峰值性能可達到10MB/秒); 高性能的搜索(在2–4GB的文本數據上,平均每次檢索響應時間小於0.1秒); 可處理海量數據(目前已知可以處理超過100GB的文本數據,在單一CPU的系統上可處理100M文檔); 提供了優秀的相關度演算法,基於短語相似度和統計(BM25)的復合Ranking方法; 支持分布式搜索; 提供文件的摘錄生成; 可作為MySQL的存儲引擎提供搜索服務; 支持布爾、短語、詞語相似度等多種檢索模式; 文檔支持多個全文檢索欄位(最大不超過32個); 文檔支持多個額外的`屬性信息(例如:分組信息,時間戳等); 停止詞查詢; 支持單一位元組編碼和UTF-8編碼; 原生的MySQL支持(同時支持MyISAM和InnoDB); 原生的PostgreSQL支持.
中文手冊可以在這里獲得(酷勤網備用下載地址:sphinx_doc_zhcn_0.9.pdf)。
二、Sphinx在windows上的安裝
1.直接在http://www.sphinxsearch.com/downloads.html找到最新的windows版本,我這里下的是Win32 release binaries with MySQL support,下載後解壓在D:sphinx目錄下;
2.在D:sphinx下新建一個data目錄用來存放索引文件,一個log目錄方日誌文件,復制D:sphinxsphinx.conf.in到D:sphinxbinsphinx.conf(注意修改文件名);
3.修改D:sphinxbinsphinx.conf,我這里列出需要修改的幾個:
type= mysql # 數據源,我這里是mysqlsql_host;= localhost # 資料庫伺服器sql_user;= root # 資料庫用戶名sql_pass;=;'' # 資料庫密碼sql_db;;;= test # 資料庫sql_port;= 3306 # 資料庫埠
sql_query_pre;;;= SET NAMES utf8 # 去掉此行前面的注釋,如果你的資料庫是uft8編碼的
index test1{#;放索引的目錄;path;;;= D:/sphinx/data/# 編碼;charset_type;;= utf-8;#; 指定utf-8的編碼表;charset_table=0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F;# 簡單分詞,只支持0和1,如果要搜索中文,請指定為1;ngram_len;;;;= 1# 需要分詞的字元,如果要搜索中文,去掉前面的注釋;ngram_chars;;;= U+3000..U+2FA1F}
# index test1stemmed : test1# {;# path;;;= @CONFDIR@/data/test1stemmed;# morphology;;= stem_en# }# 如果沒有分布式索引,注釋掉下面的內容# index dist1# {;# 'distributed' index type MUST be specified;# type;;;;= distributed
;# local index to be searched;# there can be many local indexes configured;# local;;;;= test1;# local;;;;= test1stemmed
;# remote agent;# multiple remote agents may be specified;# syntax is 'hostname:port:index1,[index2[,...]];# agent;;;;= localhost:3313:remote1;# agent;;;;= localhost:3314:remote2,remote3
;# remote agent connection timeout, milliseconds;# optional, default is 1000 ms, ie. 1 sec;# agent_connect_timeout;= 1000
;# remote agent query timeout, milliseconds;# optional, default is 3000 ms, ie. 3 sec;# agent_query_timeout;;= 3000# }
# 搜索服務需要修改的部分searchd{;# 日誌;log;;;;;= D:/sphinx/log/searchd.log
;# PID file, searchd process ID file name;pid_file;;;= D:/sphinx/log/searchd.pid
# windows下啟動searchd服務一定要注釋掉這個 # seamless_rotate;;= 1}
4.導入測試數據
C:Program FilesMySQLMySQL Server 5.0bin>mysql -uroot test<d:/sphinx/example.sql
5.建立索引
D:sphinxbin>indexer.exe test1
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
indexing index 『test1′…
collected 4 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 4 docs, 193 bytes
total 0.101 sec, 1916.30 bytes/sec, 39.72 docs/sec
D:sphinxbin>
6.搜索』test』試試
D:sphinxbin>search.exe test
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『test 『: returned 3 matches of 3 total in 0.000 sec
displaying matches:
1. document=1, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=1
;;;;;group_id=1
;;;;;group_id2=5
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test one
;;;;;content=this is my test document number one. also checking search within
;phrases.
2. document=2, weight=2, group_id=1, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=2
;;;;;group_id=1
;;;;;group_id2=6
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=test two
;;;;;content=this is my test document number two
3. document=4, weight=1, group_id=2, date_added=Wed Nov 26 14:58:59 2008
;;;;;id=4
;;;;;group_id=2
;;;;;group_id2=8
;;;;;date_added=2008-11-26 14:58:59
;;;;;title=doc number four
;;;;;content=this is to test groups
words:
1. 『test』: 3 documents, 5 hits
D:sphinxbin>
都所出來了吧。
6.測試中文搜索
修改test資料庫中documents數據表,
UPDATE `test`.`documents` SET `title` = 『測試中文』, `content` = 『this is my test document number two,應該搜的到吧』 WHERE `documents`.`id` = 2;
重建索引:
D:sphinxbin>indexer.exe –all
搜索』中文』試試:
D:sphinxbin>search.exe 中文
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
using config file 『./sphinx.conf』…
index 『test1′: query 『中文 『: returned 0 matches of 0 total in 0.000 sec
words:
D:sphinxbin>
貌似沒有搜到,這是因為windows命令行中的編碼是gbk,當然搜不出來。我們可以用程序試試,在D:sphinxapi下新建一個foo.php的文件,注意utf-8編碼
<?php
require 』sphinxapi.php』;
$s = new SphinxClient();
$s->SetServer(』localhost』,3312);
$result = $s->Query(』中文』);
var_mp($result);
?>
啟動Sphinx searchd服務
D:sphinxbin>searchd.exe
Sphinx 0.9.8-release (r1533)
Copyright (c) 2001-2008, Andrew Aksyonoff
WARNING: forcing –console mode on Windows
using config file 『./sphinx.conf』…
creating server socket on 0.0.0.0:3312
accepting connections
執行PHP查詢:
php d:/sphinx/api/foo.php
結果是不是出來?剩下的工作就是去看手冊,慢慢摸索高階的配置。
8. 基於機器學習的情感分析是什麼意思
以下以語義特徵為例:
機器學習基於語義特徵的情感分析
基於語義特徵的情感分析先人已有研究,可以通過情感詞典匹配來做,但是應用機器學習在這方面會使精確度更高些。
以本人參與的一個項目為主,總結下相關技術點。
背景是:分析用戶評論感情色彩是積極還是消極,即是褒還是貶。
具體步驟為:
1.有監督的人工給文本標注類標簽。如有5000條評論數據,我們給其中的1000條標為積極的,再選1000條標為消極的,積極和消極就是所謂的類標簽。
2.選擇特徵。從積極的評論數據中按詞來選擇積極的所有特徵。同理,從消極的評論數據中按詞來選擇消極的所有特徵。如「這款游戲非常好玩」->」這款」->「游戲」->」非常」->」好玩」,分為四個特徵詞,也可以採用雙詞搭配,「這個游戲」和「非常好玩」作為特徵。
3.特徵降維,減少特徵的數量。如上「這個游戲非常好玩」中的余滾孫「這個游戲」沒有必要作為特徵,因為「好玩」或「非常好玩」已經決定了評論是積極的。
4.將語料文本變成使用特徵表示。
5.統計所有特徵出現的次數,並按倒序排序。
6.從以上結果中選出排序最靠前的一些特徵作為最終的評判特徵。備虧
7.使用訓練數據根據特徵訓練分類演算法,得到分類器。
8.用測試數據檢測分類器的准確度。
我們將數據分為兩部分:開發集、測試集。用開發集的數據訓練分類演算法得到分類器豎鏈;再用分類器對測試集里的數據進行分類,給出分類預測得到的標簽;對比分類標簽和人工標注得到的標簽的差異,計算出准確度。
9. python如何跳過錯誤繼續運行,同時刪除產生錯誤的文檔
這就需要用到python的異常處理機制:
try:
raiseException('Ohno!產生了一個異常!')
exceptException,e:
print'發生了一個錯誤:%s,你可以在這里刪除錯誤的文檔'%e
finally:
print'這里無論是否發生異常,都會執行'
else:
print'在沒有發生異常時執行'
#繼續下面的流程
參考以上代碼修改你的程序。望採納。