毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/09/14【83日目】自然言語処理100本ノック、その2

006の続きからです。 和集合、積集合が何だかわからなかったレベルなのですが、以下のようですね。

2つの集合に対して、「少なくとも片方に入っているもの」を集めた集合を和集合と言う。「両方ともに入っているもの」を集めた集合を積集合と言う。 それで、差集合が集合から集合を引いたものらしいです。

改めて、006問目。

A = "paraparaparadise"
B = "paragraph"

X = set()
Y = set()

for bi in range(len(A)-1):
    X.add(A[bi] + A[bi+1])

for bi in range(len(B)-1):
    Y.add(B[bi] + B[bi+1])
    
print(X | Y)
print(X & Y)
print(X - Y)

if "se" in(X & Y):
    print("seはある")
else:
    print("seはない")

set型ですと、この辺りが使えるのですね。 print(X | Y) -> XまたはYに含まれる(和集合) print(X & Y) -> XとY両方に含まれる(積集合) print(X - Y) -> XとYの差(差集合)

007

def kion(x,y,z):
    x = str(x)
    y = str(y)
    z = str(z)
    moji = x + "時の" + y + "は" +z
    return moji

kion(12,"気温",22.4)

難しいところは特になかったです。

008 まず問題の意味がよくわかってなかったのですが、よくよく見たら (219 マイナス 文字コード)を返せって言う問題ですね。 ord関数を使用すれば、Unicodeのコードポイントを表す整数を返すそうなので、これとchr関数を使用すればできそうです。

print(ord("a"))
print(chr(5656))

実行結果。

97
ᘘ

解答

def cipher(text):
    henkan = []
    for moji in text:
        if moji.islower():
            moji = chr(219 - ord(moji))
            henkan.append(moji)
        else:
            henkan.append(moji)
        string = ",".join(henkan)
        string = string.replace(",","")
    return string
string = cipher("Hogehoge")
print(string)
Hltvsltv

復元は暗号化したものを同じ関数に渡せば元に戻ります。

string = cipher(string)
print(string)
Hogehoge

どうでもいいですが、Jupyter Notebookでオブジェクトの後ろに?を付けると、そのオブジェクトの情報が見れるんですね。

string?
Type:        str
String form: Hltvsltv
Length:      8
Docstring:  
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.

009 Typoglycemia(タイポグリセリア)と言うのは、最初の最後の文字が合っていれば読めてしまうと言う現象だそうです。おそらくrandomなんちゃらというのがあるのだろうな、と思いましたらrandom.shuffleと言うのがありましたので、これを使えば良さそうです。

import random

moji9 = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."

li = moji9.split(" ")
bara = []
for tango in li:
    if 4 < len(tango):
        text_list = list(tango[1:-2])
        random.shuffle(text_list)
        # print(text_list)
        bara_list = tango[0] + ",".join(text_list) + tango[-1]
        print(bara_list.replace(",",""))

なんとなくコツはつかめてきましたが、まだ10問目か。。。先は長いですね。

今日の結果

今日のAKBの呟きは57件でした。 要約するとこんな感じです。

"今日の公演もありが田口でした!!今日は面白さを大切にしました!面白くなれてたかな???笑笑#稲垣香織""すごい!まなかさんの動画をチェックして!#TikTok""すごいすごーーーーい!!!私も参加させていただきますので、皆さん応援よろしくお願いします?✨""念願の#ノナラパール?
久しぶりのお姉様方とまりやんぬさんに会え…""#せいROOMマドレーヌ無事完成!!!アイカブのことも色々教えてくれてありがとうございました✨✨がんばるぞい\(^o^)/""明日の朝9時半からお料理SHOWROOMします!!三連休中日だけど、、早起きしてくれると嬉しいなぁ?
'嬉しい': 8, 'すごい': 5, '楽しい': 5, '可愛い': 3, '面白い': 3, '凄い': 2, 'ほしい': 2, '新しい': 1, '悔しい': 1, '無い': 1, 'いい': 1, 'かっこいい': 1, '素晴らしい': 1, '優しい': 1, 'かっこよい': 1, 'かわいい': 1, 'つらい': 1, 'おもしろい': 1, 'おいしい': 1, '暖かい': 1
'今日': 10, 'センチメンタルトレイン': 9, '嬉しい': 8, '公演': 8, 'エーケービーフォーティーエイト': 8, '笑': 6, 'さん': 6, '皆さん': 6, '生': 6, 'すごい': 5, '楽しい': 5, 'の': 5, '女子': 5, '会': 5,
'する': 33, '見る': 11, '今日': 10, 'センチメンタルトレイン': 9, '嬉しい': 8, '公演': 8, 'エーケービーフォーティーエイト': 8, 'くださる': 8, '笑': 6, 'さん': 6, '皆さん': 6, '生': 6, 'やる': 6, 'せる': 6, 'すごい': 5, '楽しい': 5, 'の': 5, '女子': 5, '会': 5, 'てる': 5, 'くれる': 5,

f:id:rimt:20180919235952p:plain