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'在没有发生异常时执行'
#继续下面的流程
参考以上代码修改你的程序。望采纳。