2016-08-27 8 views
0

Мне нужны ngrams. Я знаю, что nltk.utils.ngrams может использоваться для получения ngrams, но на практике функция ngrams возвращает объект-генератор. Я всегда могу перебирать его и хранить ngrams в списке. Но есть ли другой, более прямой способ получить эти ngrams в списке без необходимости повторять их?Есть ли способ получить несколько заказов ngram, используя NTLK вместо того, чтобы получать итерацию по генератору?

+2

'someList = список (someGenerator) '- будет ли это работать? – georg

+0

nope. возвращает пустой список ... –

ответ

2

@ комментарий georg почти все гвозди это.

In [12]: from nltk.util import ngrams 

In [13]: g = ngrams([1,2,3,4,5], 3) 

In [14]: list(g) 
Out[14]: [(1, 2, 3), (2, 3, 4), (3, 4, 5)] 

In [15]: g = ngrams([1,2,3,4,5], 3) 

In [16]: map(lambda x: x, g) 
Out[16]: [(1, 2, 3), (2, 3, 4), (3, 4, 5)] 
+0

Действительно! что-то с моим интерпретатором python ... он отказался работать в первый раз, когда я пытался. работает сейчас. Благодаря! –

+0

Короткий вопрос, почему вы используете 'map', когда вы можете создать экземпляр/материализовать генератор с помощью' list'? Есть ли разница в эффективности? – alvas

+0

@alvas Не знаю, о чем я знаю. Я просто пытался показать разные способы. –

0

или же без nltk:

from itertools import chain 

def ngrams(L, n = 2): 
    orders = [n] if type(n) is int else sorted(list(n)) 
    return list(chain(*[zip(*[L[i:] for i in range(n)]) for n in orders])) 

>>> ngrams([1,2,3,4,5], n = 3) 
[(1, 2, 3), (2, 3, 4), (3, 4, 5)] 
>>> ngrams([1,2,3,4,5], n = [2,3]) 
[(1, 2), (2, 3), (3, 4), (4, 5), (1, 2, 3), (2, 3, 4), (3, 4, 5)] 
3

Там на самом деле встроенная функция, чтобы получить несколько порядков ngrams называют everygrams см https://github.com/nltk/nltk/blob/develop/nltk/util.py#L504

>>> from nltk import everygrams 
>>> sent = 'a b c'.split() 
# By default, it will extract every possible order of ngrams. 
>>> list(everygrams(sent)) 
[('a',), ('b',), ('c',), ('a', 'b'), ('b', 'c'), ('a', 'b', 'c')] 
# You can set a max order or ngrams. 
>>> list(everygrams(sent, max_len=2)) 
[('a',), ('b',), ('c',), ('a', 'b'), ('b', 'c')] 
# Or specify a range. 
>>> list(everygrams(sent, min_len=2, max_len=3)) 
[('a', 'b'), ('b', 'c'), ('a', 'b', 'c')] 

 Смежные вопросы

  • Нет связанных вопросов^_^