英文分词器代码实现解读
来源:互联网 发布:三个世界 知乎 编辑:程序博客网 时间:2024/04/26 00:37
知识参考链接点这里
背景知识:分词、朴素贝叶斯、python(装饰器、缓存制表)、后缀数组
类的装饰器
最初,我们说装饰器是一个修改另一个函数的函数,但其实它们可以用于修改类或者方法。对类进行装饰并不常见,但某些情况下作为元类(metaclass)的一个替代,类的装饰器是一个有用的工具。
foo = ['important', 'foo', 'stuff']def add_foo(klass): klass.foo = foo return klass@add_fooclass Person(object): passbrian = Person()print brian.foo# >> ['important', 'foo', 'stuff']
缓存制表(Memoization)
缓存制表是避免潜在的昂贵的重复计算的一种方法,通过缓存函数每次执行的结果来实现。这样,下一次函数以相同的参数执行,就可以从缓存中获取返回结果,不需要再次计算结果。
from functools import wrapsdef memoize(func): cache = {} @wraps(func) def wrapper(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrapper@memoizedef an_expensive_function(arg1, arg2, arg3): ...
上代码:
35 @memo 36 def segment(text): 37 "Return a list of words that is the best segmentation of text." 38 if not text: return [] 39 candidates = ([first]+segment(rem) for first,rem in splits(text)) 40 return max(candidates, key=Pwords) 41 42 def splits(text, L=20): 43 "Return a list of all possible (first, rem) pairs, len(first)<=L." 44 return [(text[:i+1], text[i+1:]) 45 for i in range(min(len(text), L))] 46 47 def Pwords(words): 48 "The Naive Bayes probability of a sequence of words." 49 return product(Pw(w) for w in words)
@memo
缓存制表,存入segment(text) 函数调用的结果
segment(text)
对text进行分词,返回概率最大的分词结果
splits(text,L=20)
splits(text,L=20)
将text进行分词,分为两个部分first+rem
Pwords(words)
返回朴素贝叶斯模型下,每个词语的概率
product
返回多个概率值乘积的结果
分词过程讲解:
比如对closethedoor进行分词的时候,很明显最佳的分词结果是close the door,那要如何得出这个最佳的分词结构呢?
比如概率从大到下是这么分布的:p(close) > p(c|lose) > p(c|l|ose) >p(c| lo | se) ………………
这个代码里面采用了后缀数组,避免了大量的重复计算
例如分词segment(close)
candidates = ([first]+segment(rem) for first,rem in splits(text))
在调用这句代码的时候,产生的结果是,c | lose , 进入segment(lose),分成l 和 ose,进入segment(ose)……如此重复,这样子的话,五个后缀的概率就全部算出来了,分别是p(close),p(lose),p(ose),p(se),p(e),
再次调用的时候,可以直接使用结果(因为结果已经存在了缓存制表中了),p(cl|o|se) = p(cl)*p(o)*p(se)
所以在segment函数中调用的时候,只完整调用了五次,因为再次调用概率的时候,那些单词已经计算出了概率,省去了大量重复计算。
感觉好像挺有收获的,很有意思,所有就记录下来了~
0 0
- 英文分词器代码实现解读
- “庖丁解牛” 分词器实现
- 英文分词+提取词干
- JavaScript英文分词
- Python 英文分词
- Python 英文分词
- PHP中文分词算法及代码实现
- 中文分词、支持向量机代码实现
- 【英文分词】Stemming Segmentation,基于词干分词
- 分词代码
- 使用LUCENE快速实现属于自己的英文分词程序——附简单实现
- Lucene实现自定义分词器
- HashMap实现中文分词器
- 英文分词算法(Porter stemmer)
- 英文分词算法(Porter stemmer)
- 英文分词算法(Porter stemmer)
- 简易英文分词算法(python)
- 解读STM32单片机:代码实现 PCROP清除
- 网络编程之格式转换
- mac上hexo博客的搭建
- 树梅派应用42:使用PHP上传文件到树莓派
- wine安装+中文配置+使用
- python语法之:单引号 双引号 三引号
- 英文分词器代码实现解读
- H Builder 浅谈移动App升级更新
- 剑指Offer之面试题26:复杂链表的复制
- Java 8 Optional
- 【ZJOI2006】bzoj1861 书架
- 树梅派应用43:树莓派上使用htpdate同步时间
- 4 时间复杂度和空间复杂度(2)
- size_t strtok
- hibernate的优缺点