百折不撓

データ系の新米エンジニアとして戦闘中。

言語処理100本ノックchap01_06

 言語処理100本ノックの6章6問目。
言語処理100本ノック 2015

 問題は、2つの短文のbigramを作り、比較して、その和集合、積集合、差集合を見つけろというもの(ちゃんとした課題文はリンク先にあります)。n-gramを作る関数は5問目で作ったので、それを利用して以下のように各集合を探してみました(言語処理100本ノックchap01_05 - 百折不撓)。

print("n-gramの数を入力してください")
N     = int(input())
print("文章1を入力してください")
para0 = input()
#para0 = "paraparaparadise"
print("文章2を入力してください")
para1 = input()
#para1 = "paragraph"

bigram0 = ngram(N, para0)
bigram1 = ngram(N, para1)
###空白文字を1つのbigramとしてしまっている場合は、ここで削除(chap1_05.pyを修正すべき)
if "" in bigram0:
    bigram0.remove("")
if "" in bigram1:
    bigram1.remove("")
    
X, Y =  set(bigram0), set(bigram1)

print("X: {}, Y: {}\n".format(X, Y))
"""和集合OR"""
wa = X.union(Y)
print("OR: {}".format(wa))

"""積集合AND"""
seki = X.intersection(Y)
print("AND: {}".format(seki))

"""差集合diff"""
sa = X.difference(Y)
print("diff: {}".format(sa))

"""Searching for <se> """
set_se = {"se"}
print("Searching for \"se\" in X\n".format(X.intersection(set_se)))
print("Searching for \"se\" in Y\n{}".format(Y.intersection(set_se)))

 set型?という集合表現をpythonは持っているのですね。そして、その演算と言うか、集合同士の関係も比較できるメソッドを持っている。数十文字からなる1文同士の比較なら、人間の目でも出来ますが、もっと長い文章になると難しいので、やはり便利ですね。
 と言うわけで、この問題は、set型のメソッドの手習い?みたいな課題でした。