kskipgram是一个ngram,它是所有ngram和每个(k-i)skipgram的超集,直到(k-i)==0(包括0个skip grams)。那么如何在python中高效地计算这些技巧呢?
以下是我尝试的代码,但没有按预期执行:
<pre>
input_list = ['all', 'this', 'happened', 'more', 'or', 'less']
def find_skipgrams(input_list, N,K):
bigram_list = []
nlist=[]
K=1
for k in range(K+1):
for i in range(len(input_list)-1):
if i+k+1<len(input_list):
nlist=[]
for j in range(N+1):
if i+k+j+1<len(input_list):
nlist.append(input_list[i+k+j+1])
bigram_list.append(nlist)
return bigram_list
</pre>
上面的代码没有正确呈现,但是printfind_skipgrams(['all', 'this', 'happened', 'more', 'or', 'less'],2,1)
给出了以下输出
[['this', 'happened', 'more'], ['happened', 'more', 'or'], ['more', 'or', 'less'], ['or', 'less'], ['less'], ['happened', 'more', 'or'], ['more', 'or', 'less'], ['or', 'less'], ['less'], ['less']]
此处列出的代码也没有给出正确的输出: https://github.com/heaven00/skipgram/blob/master/skipgram.py
打印技巧(“您的姓名”)给出: ['什么,是','是,你的','你的,名字','名字','什么,你的','是,名字']
名称是一个unigram!
尽管这将完全从代码中分离出来,并将其推迟到外部库;但您可以使用Colibri Core(https://proycon.github.io/colibri-core)来提取skipgram。这是一个专门为从大文本语料库中高效提取n-gram和skipgram而编写的库。代码库是C++的(速度/效率),但是Python绑定是可用的。
您正确地提到了效率,因为skipgram提取很快就显示出指数级的复杂性,如果您只像在
input_list
中那样传递一个句子,这可能不是什么大问题,但是如果您在大型语料库数据上发布它,就会出现问题。为了减少这种情况,您可以设置参数,比如出现阈值,或者要求skipgram的每个跳跃至少可以填充x个不同的n-grams。网站上有一个关于这一切的更广泛的Python教程。
免责声明:我是Colibri Core的作者
编辑
最新的NLTK 3.2.5版本实现了
skipgrams
。下面是NLTK repo中@jnothman的一个更干净的实现:https://github.com/nltk/nltk/blob/develop/nltk/util.py#L538
[出局]:
从OP链接的paper中,可以看到以下字符串:
收益率:
稍微修改一下NLTK的
ngrams
代码(https://github.com/nltk/nltk/blob/develop/nltk/util.py#L383):让我们做一些理论测试来匹配本文中的示例:
但请注意,如果
n+k > len(sequence)
,它将产生与skipgrams(sequence, n, k-1)
相同的效果(这不是一个bug,它是一个故障保护功能),例如这允许
n == k
,但不允许n > k
,如下面几行所示:为了理解,让我们试着去理解“神秘”一词:
给定一个唯一项列表,组合将产生以下结果:
由于令牌列表的索引总是唯一的,例如
可以计算范围的可能combinations (without replacement):
如果我们将索引映射回标记列表:
然后我们与
current_token
连接,得到当前令牌和context+skip窗口的skipgrams:所以在那之后我们继续下一个词。
相关问题 更多 >
编程相关推荐