Fre*_*Foo 23
既然你没有说明你是否想要单词或字符级的n-gram,我只是假设前者,而不失一般性.
我还假设你从一个由字符串表示的标记列表开始.您可以轻松完成的是自己编写n-gram提取.
def ngrams(tokens, MIN_N, MAX_N):
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
yield tokens[i:j]
Run Code Online (Sandbox Code Playgroud)
然后用yield你想要对每个n-gram执行的实际操作替换(将其添加到a dict,将其存储在数据库中,等等)以消除生成器开销.
最后,如果它真的不够快,将上面的内容转换为Cython并进行编译.使用a defaultdict代替的示例yield:
def ngrams(tokens, int MIN_N, int MAX_N):
cdef Py_ssize_t i, j, n_tokens
count = defaultdict(int)
join_spaces = " ".join
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
count[join_spaces(tokens[i:j])] += 1
return count
Run Code Online (Sandbox Code Playgroud)
小智 8
您可以在这里使用zip 和splat(*)运算符找到pythonic,优雅和快速的ngram生成函数 :
def find_ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13244 次 |
| 最近记录: |