2020年12月8日火曜日

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

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


解答例

#前問のngramを使いまわす
def ngram(n, lst):
  return list(zip(*[lst[i:] for i in range(n)]))

#対象となる文字列の定義
str1 = 'paraparaparadise'
str2 = 'paragraph'

#setを使って集合を定義する
X = set(ngram(2, str1))
Y = set(ngram(2, str2))

#集合の演算を行う
union = X | Y
intersection = X & Y
difference = X - Y

#集合の表示
print('X:', X)
print('Y:', Y)
print('和集合:', union)
print('積集合:', intersection)
print('差集合:', difference)
#「<=」で部分集合について判定している
print('Xにseが含まれるか:', {('s', 'e')} <= X)
print('Yにseが含まれるか:', {('s', 'e')} <= Y)


出力

X: {('a', 'd'), ('r', 'a'), ('a', 'p'), ('i', 's'), ('a', 'r'), ('p', 'a'), ('s', 'e'), ('d', 'i')}
Y: {('r', 'a'), ('a', 'p'), ('a', 'r'), ('g', 'r'), ('p', 'a'), ('p', 'h'), ('a', 'g')}
和集合: {('a', 'd'), ('r', 'a'), ('a', 'p'), ('i', 's'), ('a', 'r'), ('g', 'r'), ('p', 'a'), ('s', 'e'), ('p', 'h'), ('a', 'g'), ('d', 'i')}
積集合: {('a', 'p'), ('p', 'a'), ('a', 'r'), ('r', 'a')}
差集合: {('s', 'e'), ('a', 'd'), ('d', 'i'), ('i', 's')}
Xにseが含まれるか: True
Yにseが含まれるか: False

 

参考リンク

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

Python, set型で集合演算(和集合、積集合や部分集合の判定など) 

 


0 件のコメント:

コメントを投稿