https://qiita.com/yamaru/items/6d66445dbd5e7cef8640
にあります、
- n-gram
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,”I am an NLPer”という文から単語bi-gram,文字bi-gramを得よ.
ここでは、[lst[i:] for i in range(n)]で、1要素目始まり、2要素目始まり、…、n要素目始まりの要素列のリストを作成し、それらをzip関数に渡して前から順番に要素を抽出することで、連続するn要素からなる組を作っています。
なお、[lst[i:] for i in range(n)]の結果は1つのリストであるため、前に*をつけることでリストを展開し、それぞれの要素列に分けた上でzip関数に渡す必要があります。
なのですが、
Python3
1 2def ngram(n, lst): 3 # ex. 4 # [str[i:] for i in range(2)] -> ['I am an NLPer', ' am an NLPer'] 5 # zip(*[str[i:] for i in range(2)]) -> zip('I am an NLPer', ' am an NLPer') 6 return list(zip(*[lst[i:] for i in range(n)])) 7 8str = 'I am an NLPer' 9words_bi_gram = ngram(2, str.split()) 10chars_bi_gram = ngram(2, str) 11 12print('単語bi-gram:', words_bi_gram) 13print('文字bi-gram:', chars_bi_gram) 14 15#結果 16 17単語bi-gram: [('am', 'an'), ('I', 'am'), ('an', 'NLPer')] 18文字bi-gram: [('I', ' '), (' ', 'N'), ('e', 'r'), ('a', 'm'), (' ', 'a'), ('n', ' '), ('L', 'P'), ('m', ' '), ('P', 'e'), ('N', 'L'), ('a', 'n')] 19
となっているのですが、
Python3
1[lst[i:] for i in range(n)]
で[1要素目始まり、2要素目始まり、3要素目始まり、...]
というリストが得られるのはわかるのですが、
なぜ最後nの数の中身になっている(n=2ならば、```
[('am', 'an'), ('I', 'am'), ('an', 'NLPer')]
zip の仕様なのか、*の仕様なのかはわからないのですが、 詳しく教えていただけませんでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。