python 言語処理100本ノック -第1章: 準備運動- 06. 集合

06. 集合

“paraparaparadise”と”paragraph”に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,’se’というbi-gramがXおよびYに含まれるかどうかを調べよ.

ポイントはいくつかありますが、まずは文字n-gramをchar_n_gram()で定義しています。
これは05. n-gramで定義したものをほぼそのまま持ってきてます。

次に20、21行目のset型のオブジェクトです。
set型は重複を許容しないコレクションです。
なぜset型を使うかというと、本章のテーマである和集合、差集合、積集合の演算を行う事ができるからです。
25~32行目がこれに該当します。

最後は文字列:’se’の存在判定です。
ここではin演算子を使って、xとyに’se’という文字列が含まれるかどうかを判定しています。

#coding: utf-8
#文字n-gram
def char_n_gram(p_target, p_n):
    result = []
    for i in range(len(p_target) - p_n + 1):
        result.append(p_target[i : i + p_n])
    return result

target1 = 'paraparaparadise'
target2 = 'paragraph'

n = 2
keyword = 'se'
x = char_n_gram(target1, n)
y = char_n_gram(target2, n)

print(x)
print(y)

xset = set(x)
yset = set(y)
print(xset)
print(yset)

#和集合
print('和集合:' + str(xset | yset))

#積集合
print('積集合:' + str(xset & yset))

#差集合
print('差集合:' + str(xset - yset))

#'se'がxに存在するか
isExistX = keyword in x
isExistY = keyword in y
print('seがxに存在するか:' + str(isExistX))
print('seがyに存在するか:' + str(isExistY))

■実行結果

['pa', 'ar', 'ra', 'ap', 'pa', 'ar', 'ra', 'ap', 'pa', 'ar', 'ra', 'ad', 'di', 'is', 'se']
['pa', 'ar', 'ra', 'ag', 'gr', 'ra', 'ap', 'ph']
{'di', 'pa', 'ap', 'ra', 'ar', 'se', 'is', 'ad'}
{'pa', 'ra', 'ar', 'ph', 'gr', 'ap', 'ag'}
和集合:{'di', 'pa', 'ap', 'ra', 'ar', 'se', 'is', 'ph', 'gr', 'ad', 'ag'}
積集合:{'pa', 'ap', 'ra', 'ar'}
差集合:{'di', 'ad', 'se', 'is'}
seがxに存在するか:True
seがyに存在するか:False

■開発環境
Windows10
Python 3.7.3
Visual Studio Code 1.33.1

■言語処理100本ノック 公式
言語処理100本ノック 2015