(二)漫话中文分词:Trie、KMP、AC自动机

Trie树 在上一篇文章当中,说到了一些匹配的算法,但是算法有了,还得需要一个高效的数据结构,不能只是通过[‘中国人’, ‘中东人’]等结构来进行存放,可以想象一下,如果有几十万的词,那么这个列表的占用的内存非常大。 Trie树,也被称为前缀树,该词源自单词retrieval,发音和try相同,Trie树可为词库提供一种高效的分词数据结构,该结构本质上是一种树状数据结构,比如”中国人”、”中东人”三个字符串构造的Trie树为下图,图中能够很清楚的看见,Trie树结构能够很好的节省相同前缀单词所浪费的空间,因为这两个词都是以”中”开头,所以可以使用同一个父辈节点。 除此之外,Trie树还对查询的……

继续阅读»»»

(一)漫话中文分词:最大匹配,双向最大,最小词数

中文分词是指将文本拆分为单词的过程,而结果集合连接起来是等于原始的文本,而中文分词一直作为NLP领域的比较重要的领域,而大多数的文本挖掘都是以分词为基础,但中文不同于英文,英文每个单词是用空格分隔,整体语义上相对于中文难度低很多。 而业务上一直有中文分词的需求,但是之前因为在忙于另外一个项目,所以一直没有研究。 近期稍空闲开始研究了相关的中文分词算法,发现中文分词总体算比较成熟,但是其中对于未登录词或者某个特定专业领域文本大部分算法分词的结果不尽人意,需要结合多种算法或者人工词典才能达到稍微好一点的效果。 中文分词的方式一共有两种,分别为: 词典分词:如正向最大匹配算法、反向最大匹配算法、双向……

继续阅读»»»

理解条件概率

样本空间(Ω) 样本空间通常指实验或随机所有可能的集合,我们常在说一个概率的时候,实际上是默认忽略掉了样本空间,比如说事件A的概率,实际上指样本空间中,事件A的数量与样本空间的占比。 比如丢硬币,硬币只有正面和反面,那么硬币的样本空间则为{正面,反面},这个时候常说的正面的概率为二分之一,实际指的是正面事件的数量与样本空间的占比,也就是1/2。 再比如说丢骰子,一个骰子有6种可能,分别对应1-6不同的数值,那么丢骰子的样本空间则为{1,2,3,4,5,6},这个时候丢到5个事件概率则为数字5在样本空间出现的次数与样本空间总数的占比。 独立事件 独立事件是指不受过去已发生的事件而影响的事件,典型……

继续阅读»»»

理解连续数据和离散数据

统计学中,将一种类型的数据总称为变量,而变量的数据称为观测,而变量的具体取值为观测值,比如下面的数据中,age和name都是变量,而18和’大红’都具体的取值被称为观测值。 age,name 18,’大红’ 21,’小花’ 同理,在统计学中,离散数据也被称为离散变量,连续数据也被称为连续变量,而如何区分两种变量的区别? 连续变量可以理解为取值范围在理论上是连续不断的,而离散变量则可以理解为取值范围是间断不连续的,他们之间的区别并无数量之分,都是无穷个。 比如家庭数量人口只有1、2、3、4个人口,不可能为1.2、1.8、2.4这样来表示人口,所以家庭人口是离散变量。 而年龄取值上通常为了方便而说……

继续阅读»»»

Python数据集合

列表 列表是有序可变的数据集合,并且一对[]来表示这是一个列表,元素之间逗号分隔,每个数据之间有逗号分隔,列表基本上可以包含很多数据类型,下面就是一个典型的列表: list = [1,2.2,’ok’,bool] 在上面的列表中存储了数据(整型、浮点型、字符串、布尔值),包含我们下面看见的几种集合类型都是可以当作列表的子元素的。 当然也可以从列表中取出数据,因为列表是有序的,所以我们可以通过索引从0开始进行取数据,你需要注意的是所有可以用索引进行得到值的都是从0开始,比如下面的代码取出了列表第一个和第三个数据。 list = [1,2.2,’ok’,bool] list[0] # 1 list……

继续阅读»»»

Python数据类型与操作符

算术运算符 + 加 – 减 * 乘 / 除 % 取余(相除后的余数) ** 取幂(注意 ^ 并不执行该运算,你可能在其他语言中见过这种情形) // 相除后向下取整到最接近的整数 整数、浮点数 数字值可以用到两种 python 数据类型: int – 表示整数值 float – 表示小数或浮点数值 你可以通过以下语法创建具有某个数据类型的值: x = int(4.7) # x is now an integer 4 y = float(4) # y is now a float of 4.0 你可以使用函数 type 检查数据类型: >>> print(type(x)) int……

继续阅读»»»

Apache2-https安装教程

环境 CentOS Linux release 7.5.1804 Apache/2.4.6 (CentOS) root用户 前言 首先我们需要建立vhost文件,在目前的环境中安装的Apache会自动把目录为/etc/httpd/conf.d下的所有*.conf文件引入到配置文件/etc/httpd/conf/httpd.conf中加载,所以我们只需要在/etc/httpd/conf.d目录下配置我们的虚拟主机文件。 免费的证书我们可以通过证书授权机构Let’s Encrypt 获取,并且我们可以通过Certbot(由Let’s Encrypt推出的获取证书的客户端 )进行生成证书,Certb……

继续阅读»»»

Python生成器

什么是生成器(generator)? 在Python中提供了一种名为generator的对象,他是通过next函数去中断执行并且generator对象具有Iterable对象,也就是说可以用于for循环,generator最大的作用是按需生成值,这个是什么意思呢?当我们需要一组元素很多的列表的时候会占用很大的内存,比如你需要生成一组从0-100000的列表,那么这个列表的长度将有10万,这是多么大的列表?如果比这个数值更大呢?那么很大一部分内存都将用来保存这个列表。 list(range(100000)) 类似于上面这样的情况,我们可以用generator对象来按需生成数值来供我们处理,你可以……

继续阅读»»»

Python 列表生成表达式

如何生成列表? 先试想一下,如果你需要生成1-50的数值列表,如果没有列表生成式你将会这样来做: x = [] i = 1 while i <= 50: x.append(i) i += 1 还有一种方法就是通过range函数生成整数数列,然后通过list函数生成一个列表返回,大概操作如下: list(range(0,50)) 当然range函数提供了第三个参数,用于设置步数,你可以理解为间隔数,比如我只需要返回0-50中的偶尔,那么我用range生成的数列需要每隔两个数生成一个: list(range(0,50,2))

Python函数参数

位置参数 位置参数是指定了多少参数,就必须输入多少参数,否则就会报错。也可以把位置参数理解为必须参数,如果没有输入同等的参数,就会报错,比如下面的代码,计算两个数的乘积。 def power(x,y): return x * y power(2,5) # 10 power(2) #报错 默认参数 默认参数指的是可以给一个参数设置一个默认值,如果用户没有输入这个参数,那么在函数内部就会用这个参数设置的默认值进行计算,比如说下面的函数是返回两个数的乘积,如果用户没有输入第二个数,就默认为数值’2’。 def power(x,y=2): return x * y power(2,5) # 10 po……

继续阅读»»»