How to make datas our friends

「エンジニアは発信していくことが責務である」という言葉に感化されて始めた勉強したことを書き留めていく備忘録的なやつ。

Pythonで2つのbi-gramの集合を求める

背景

言語処理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'}

024minion.hatenablog.jp

集合の理解が曖昧だったのでここを参照しました。図があってわかりやすし。
herb.h.kobe-u.ac.jp

また、for文を回してなんとかしようかなと思ったのですが、Pythonにはset型という便利なやーつがあるらしいのでそれで全部まかなえました。

3.7 set(集合)型 -- set, frozenset

今回はunion/intersection/deffirence関数を使用しましたが他の関数でも代用できそう。
今度、別の関数もいじってみようと思います。