LoginSignup
4
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-09-17

言語処理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('差集合(X - Y):' + str(set_sub))
set_sub = set_y - set_x
print('差集合(Y - X):' + str(set_sub))

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

実行結果:

端末
X:{'se', 'ap', 'pa', 'is', 'di', 'ar', 'ra', 'ad'}
Y:{'ag', 'ap', 'pa', 'ra', 'ph', 'ar', 'gr'}
和集合:{'ag', 'se', 'ap', 'pa', 'is', 'ph', 'di', 'ar', 'ra', 'gr', 'ad'}
積集合:{'ar', 'ap', 'pa', 'ra'}
差集合(X - Y):{'se', 'is', 'di', 'ad'}
差集合(Y - X):{'ph', 'gr', 'ag'}
seがXに含まれる:True
seがYに含まれる:False

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

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

それにしても、こんなところでparaparaparadiseが出てくるとは^^
 
7本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。

4
1
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1