每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
openNLP是NLP中比较好的开源工具,R语言中有openNLP packages,但是呢,貌似对中文的支持并不好,笔者试了试,发现结果并不如意。但是也算认识了一番,就来介绍一下。
一些内容转载于白宁超老师:
————————————————————————————————————————
维基百科: OpenNLP库是一个基于的文本处理的,它支持自然语言处理中一些共有的任务,例如:、、、(指在句子中辨认出专有名词,例如:人名)、()、及。这些任务通常都需要较为先进的文字处理服务功能。
官方文档:Apache的OpenNLP库是自然语言文本的处理基于机器学习的工具包。它支持最常见的NLP任务,如断词,句子切分,部分词性标注,命名实体提取,分块,解析和指代消解。这些任务通常需要建立更先进的文字处理服务。OpenNLP还包括最大熵和基于感知机器学习。该OpenNLP项目的目标是创造上述任务的成熟工具包。一个附加的目的是提供一种大量预建模型为各种语言,以及这些模型衍生自注释文本资源。
————————————————————————————————————————
R中的openNLP主要有以下几个功能:
文本分块由除以单词句法相关部分,如名词基,动词基的文字,但没有指定其内部结构,也没有其在主句作用。
名称查找器可检测文本命名实体和数字。为了能够检测实体名称搜索需要的模型。该模型是依赖于语言和实体类型这是训练。所述OpenNLP项目提供了许多这些各种免费提供的语料库训练有素预训练名取景模式。后面会提到如何下载。
根据不同的模型可以查找人名、地名等实体名。
语音标记器的部分标记符号与基于符号本身和符号的上下文中它们的相应字类型。符号可能取决于符号和上下文使用多个POS标签。该OpenNLP POS标注器使用的概率模型来预测正确的POS标记出了标签组。为了限制可能的标记的符号标记字典可以使用这增加了捉人者的标记和运行时性能。
句子检测器是用于检测句子边界。
句子探测器返回一个字符串数组。
尝试解析器最简单的方法是在命令行工具。该工具仅用于演示和测试。请从我们网站上的英文分块解析器模型,并用以下命令启动解析工具。
OpenNLP断词段输入字符序列为标记。常是这是由空格分隔的单词,但也有例外。例如,“isn't”被分割为“is”与“n't",因为它是AA简要格式”isn't“我们的句子分为以下标记:符号通常是词语,标点符号,数字等OpenNLP提供多种标记生成器的实现:
空白标记生成器 - 一个空白标记生成器,非空白序列被确定为符号
简单的标记生成器 - 一个字符类标记生成器,同样的字符类的序列标记
可学习标记生成器 - 一个最大熵标记生成器,检测基于概率模型符号边界
————————————————————————————————————————
openNLP基于众多语料训练了很多已有的实体词、取词场景等,在R中需要到指定网址下载(),这里笔者也附上openNLP的官方链接()
从大小来看也知道en是最全面的,所以要下载。
下载的方式跟调用包一样方便:
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下:
所有的非叶子节点中存储的全部是索引信息
在叶子节点中存储的 value值其实是 数据库中某行数据的index
MyISAM引擎 索引文件的查看:
InnoDB引擎 索引文件的查看:
InnoDB的实现方式业内也称其为聚簇索引, 什么是聚簇索引呢? 就是相邻的行的简直被存储到一起, 对比上面的两幅图片就会发现, 在InnDB中, B+树的叶子节点中存储的是数据行中的一行行记录, 缺点: 因为索引文件被存放在硬盘上, 所以很占硬盘的空间
一般我们会在每一个表中添加一列 取名 id, 设置它为primary key , 即将他设置成主键, 如果使用的存储引擎也是InnoDB的话, 底层就会建立起主键索引, 也是聚簇索引, 并且会自动按照id的大小为我们排好序,(因为它的一个有序的树)
局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。 更进一步说, 当我们通过程序向操作系统发送指令让它读取我们指定的数据时, 操作系统会一次性读取一页(centos 每页4kb大小,InnoDB存储引擎中每一页16kb)的数据, 它遵循局部性理论, 猜测当用户需要使用某个数据时, 用户很可能会使用这个数据周围的数据,故而进行一次
什么是页呢? 简单说,就是一条条数据被的存储在磁盘上, 使用数据时需要先将数据从磁盘上读取到内存中, InnoDB每次读出数据时同样会遵循 局部性原理, 而不是一条条读取, 于是InnoDB将数据划分成一个一个的页, 以页作为和磁盘之间交互的基本单位
文件头部, 存储页的一些通用信息
页面头部, 存储数据页专有的信息
最大记录和最小记录, 这是两个虚拟的行记录
用户记录, 用来实际存储行记录中的内容
空闲空间, 页中尚位使用的空间
页面目录, 存储页中某些记录的位置
文件尾部 , 用来校验页是否完整
每一页中存储的行数据越多. 整体的性能就会越强
compact的行格式如下图所示
可以看到在行格式中在存储真正的数据的前面会存储一些其他信息, 这些信息是为了描述这条记录而不得不添加的一些信息, 这些额外的信息就是上图中的前三行
在mysql中char是固定长度的类型, 同时mysql还支持诸如像 varchar这样可变长度的类型, 不止varchar , 想 varbinary text blob这样的变长数据类型, 因为 变长的数据类型的列存储的数据的长度是不固定的, 所以说我们在存储真正的数据时, 也得将这些数据到底占用了多大的长度也给保存起来
compact行格式会将值可以为NULL的列统一标记在 NULL标志位中, 如果数据表中所有的字段都被标记上not null , 那么就没有NULL值列表
记录头信息, 顾名思义就是用来描述记录头中的信息, 记录头信息由固定的5个字节组成, 一共40位, 不同位代表的意思也不同, 如下表
标记改行记录是否被删除了
标记在 B+树中每层的非叶子节点中最小的node
表示当前记录拥有的记录数
表示当前记录在堆中的位置
表示当前记录的类型 , 0表示普通记录, 1表示B+树中非叶子节点记录, 2表示最小记录 ,3表示最大记录
表示下一条记录的相对位置
在mysql中每一行, 能存储的最大的字节数是65535个字节数, 此时我们使用下面的sql执行时就会出现行溢出现象
给varchar申请最大65535 , 再加上compact行格式中还有前面三个非数据列占用内存,所以一准溢出, 如果不想溢出, 可以适当的将 65535 - 3
前面说了, InnoDB中数据的读取按照页为单位, 每一页的大小是 16kb, 换算成字节就是16384个字节, 但是每行最多存储 65535个字节啊, 也就是说一行数据可能需要好几个页来存储
compact行格式会在存储真实数据的列中多存储一部分数据, 这部分数据中存储的就是下一页的地址
dynamic行格式 中直接存储数据所在的地址, 换句话说就是数据都被存储在了其他页上
compressed行格式会使用压缩算法对行格式进行压缩处理
一般我们都是将表中的id列设置为主键, 这就会形成主键索引, 于是我们需要注意了:
主键的占用的空间越小,整体的检索效率就会越高
为什么这么说呢? 这就可以结合页的概念来解析, 在B+树这种数据结果中, 叶子节点中用来存储数据, 存储数据的格式类似Key-value key就是索引值, value就是数据内容, 如果索引占用的空间太大的话, 单页16kb能存储的索引就越小, 这就导致数据被分散在更多的页上, 致使查询的效率降低
虽然建立索引能提升查询的效率, 根据前人的经验看, 这并不是一定的, 建立索引本身会直接消耗内存空间, 同时索, 插入,删除, 这种写操作就会打破B+树的平衡面临索引的重建, 一般出现如下两种情况时,是不推荐建立索引的
我们计算一下索引的选择性很低
兼顾 - 索引的选择性与前缀索引
所谓选择性,其实就是说不重复出现的索引值(基数,Cardinality) 与 表中的记录数的比值
即: 选择性= 基数 / 记录数
选择性的取值范围在(0,1]之间, 选择性越接近1 , 说明建立索引的必要性就越强, 比如对sex列进行建立索引,这里面非男即女, 如果对它建立索引的话, 其实是没意义的, 还不如直接进行全表扫描来的快
如何使用sql计算选择性呢? 严格遵循上面的公式
更详细的例子看下面的连接
索引无法存储null值
如果条件中有or, 即使条件中存在索引也不会使用索引,如果既想使用or,又想使用索引, 就给所有or条件控制的列加上索引
使用like查询时, 如果以%开头,肯定是进行全表扫描
使用like查询时, 如果%在条件后面
对于主键索引, 索引失效
对于普通索引, 索引不失效
如果列的类型是字符串类型, 那么一定要在条件中将数据用引号引起来,不然也会是索引失效
如果mysql认为全表扫描比用索引块, 同样不会使用索引
联合索引, 也叫复合索引,说白了就是多个字段一起组合成一个索引
像下面这样使用 id + title 组合在一起构成一个联合索引
如果我们像上图那样创建了索引,我们只要保证我们的 id+title 两者结合起来全局唯一就ok
建立联合索引同样是需要进行排序的,排序的规则就是按照联合索引所有列组成的字符串的之间的先后顺序进行排序, 如a比b优先
使用联合索引进行查询时一定要遵循左前缀原则, 什么是左前缀原则呢? 就是说想让索引生效的话,一定要添加上第一个索引, 只使用第二个索引进行查询的话会导致索引失效
但是如果我们不使用第一个索引id, 像这样 where title = '唐诗' , 结果就是导致索引失效
联合索引的分组&排序
demo1: 当我们像下面这样写sql时, 就会先按照id进行排序, 当id相同时,再按照title进行排序
demo2: 当我们像下面这样写sql时, 就会先将id相同的划分为一组, 再将title相同的划分为一组
demo3: ASC和DESC混用, 其实大家都知道底层使用B+树, 本身就是有序的, 要是不加限制的话,默认就是ASC, 反而是混着使用就使得索引失效
查询超过多少秒才记录下来
# 查看mysql是否开启了慢查询
# 将全局变量设置为ON
# 查看慢查询日志存储的位置
# 查看规定的超过多少秒才被算作慢查询记录下来
# 超过一秒就记录 , 每次修改这个配置都重新建立一次链接
最大熵原理: 在学习概率模型时,在所有可能的概率模型分布中,熵最大的模型就是最好的模型。所以用最大熵原理作为约束条件选取的模型就是最大熵模型。最大熵原理通过熵的最大化来表示等可能性。
本代码的github地址: