Edited at

素人の言語処理100本ノック:06

More than 1 year has passed since last update.

言語処理100本ノック 2015の挑戦記録です。環境はUbuntu 16.04 LTS + Python 3.5.2 :: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧はこちらからどうぞ。


第1章: 準備運動


06.集合


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


出来上がったコード:


main.py

# coding: utf-8

def n_gram(target, n):
'''指定されたリストからn-gramを作成

引数:
target -- 対象リスト
n -- n-gramのn値(1ならuni-gram、2ならbi-gram...)
戻り値:
gramのリスト
'''
result = []
for i in range(0, len(target) - n + 1):
result.append(target[i:i + n])

return result

# 集合の作成
set_x = set(n_gram('paraparaparadise', 2))
print('X:' + str(set_x))
set_y = set(n_gram('paragraph', 2))
print('Y:' + str(set_y))

# 和集合
set_or = set_x | set_y
print('和集合:' + str(set_or))

# 積集合
set_and = set_x & set_y
print('積集合:' + str(set_and))

# 差集合
set_sub = set_x - set_y
print('差集合:' + str(set_sub))

# 'se'が含まれるか?
print('seがXに含まれる:' + str('se' in set_x))
print('seがYに含まれる:' + str('se' in set_y))


実行結果:


端末

X:{'ar', 'se', 'di', 'is', 'pa', 'ap', 'ad', 'ra'}

Y:{'ar', 'gr', 'ph', 'ra', 'pa', 'ap', 'ag'}
和集合:{'ar', 'gr', 'se', 'ph', 'di', 'is', 'pa', 'ap', 'ad', 'ra', 'ag'}
積集合:{'ar', 'ap', 'pa', 'ra'}
差集合:{'di', 'is', 'se', 'ad'}
seXに含まれる:True
seYに含まれる:False


n_gram()前問の使い回しです。

先輩方の回答には、set.union()set.intersection()set.difference()を使われているものが多いですね。そちらの方が可読性が高いということですが、英語が苦手な私は|&-の方が直感的なので、こちらにしてみました。

それにしても、こんなところでparaparaparadiseが出てくるとは^^

 

7本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。