2020年12月8日火曜日

言語処理100本ノック 問題05

問. 与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,”I am an NLPer”という文から単語bi-gram,文字bi-gramを得よ

 

解答例

#ngramの定義

def ngram(n, lst):

#要素(単語であったり、文字であったり)ごとにいくつかに区切って、zip関数に渡す
  return list(zip(*[lst[i:] for i in range(n)]))

#対象となる文字列を読み込む

str = 'I am an NLPer'

#単語bi-gramの定義。splitで単語に区切っている
words_bi_gram = ngram(2, str.split())
 

#文字bi-gramの定義。strを1文字ずつ読み込んで、2つずつzip関数に渡す。

chars_bi_gram = ngram(2, str)

#単語bi-gramと文字bi-gramの結果の表示
print('単語bi-gram:', words_bi_gram)
print('文字bi-gram:', chars_bi_gram) 


出力

単語bi-gram: [('I', 'am'), ('am', 'an'), ('an', 'NLPer')]
文字bi-gram: [('I', ' '), (' ', 'a'), ('a', 'm'), ('m', ' '), (' ', 'a'), ('a', 'n'), ('n', ' '), (' ', 'N'), ('N', 'L'), ('L', 'P'), ('P', 'e'), ('e', 'r')]


ポイント

・zip関数を使って、リストを作る

・zip関数はfor loopと一緒に使う。

 

参考リンク

【言語処理100本ノック 2020】第1章: 準備運動 

言語処理100本ノック 2020【00~39 解答】 

Python, zip関数の使い方: 複数のリストの要素をまとめて取得

【Python入門】zip関数の使い方をわかりやすく解説! 


0 件のコメント:

コメントを投稿