背景
言語処理100本ノック 2015を今やっているのでその備忘録的なやつ。
やりたいこと
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を、それぞれXとYとして求め、XとYの和集合・積集合・差集合を求める。
さらに、'se'というbi-gramがXおよびYに含まれるかどうかを調べる。
結果
set型を使用して意外と簡単にできました。
> x = set(ngram('paraparaparadise', 2, 'char')) > y = set(ngram('paragraph', 2, 'char')) # x y の和集合 > x.union(y) > {'ad', 'ag', 'ap', 'ar', 'di', 'gr', 'is', 'pa', 'ph', 'ra', 'se'} # x y の積集合 > x.intersection(y) > {'ap', 'ar', 'pa', 'ra'} # x の差集合 > x.difference(y) > {'ad', 'di', 'is', 'se'} # 'se' がxyに含まれるかの判定 > 'se' in x.union(y) > True
解説/考察
前記事で作成したn-gramを返す関数ngramをそのまま利用して文字列「paraparaparadise」と「paragraph」のbi-gramをそれぞれ変数x/yに代入してます。
> x = set(ngram('paraparaparadise', 2, 'char')) > x > {'ad', 'ap', 'ar', 'di', 'is', 'pa', 'ra', 'se'} > y = set(ngram('paragraph', 2, 'char')) > y > {'ag', 'ap', 'ar', 'gr', 'pa', 'ph', 'ra'}
集合の理解が曖昧だったのでここを参照しました。図があってわかりやすし。
herb.h.kobe-u.ac.jp
また、for文を回してなんとかしようかなと思ったのですが、Pythonにはset型という便利なやーつがあるらしいのでそれで全部まかなえました。
3.7 set(集合)型 -- set, frozenset
今回はunion/intersection/deffirence関数を使用しましたが他の関数でも代用できそう。
今度、別の関数もいじってみようと思います。