TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

▲心くじけず言語処理100本ノック==00~04==

f:id:TBT_matsu:20200515145048p:plain
こんにちは!
テービーテックの村松です。
「本日の関数」シリーズに続きまして小ネタ集その2です。
「言語処理100本ノック2020]」
nlp100.github.io
に挑戦していきます!

ちょっとずつですが進めてまいりますので、
途中でくじけないか見守ってください・・・。
そして、皆さんも一緒に挑戦してみましょう!

では、さっそくまいります!

第1章: 準備運動

00.文字列の逆順

「文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.」

t = 'stressed'
t[::-1]
##結果
'desserts'

スライスという操作になります。
リストの時にも使えますね。
[]の中の意味は[start : end : step]。
[3 : 5 : 1]なら3から5までを1つ間隔といった感じになります。
省略した時は[最初の要素 : 最後の要素 : 1]とされます。
今回は逆順にするのでstepを「-1」にしました。

01.「パタトクカシーー」

「「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.」

t = 'パタトクカシーー'
t[1::2]
##結果
'タクシー'

続いて同じくスライス操作で奇数の文字を抜き出しました。
[1::2]で1番目('タ')から最後までを2つ間隔で抜き出す、になります。

02.「パトカー」+「タクシー」=「パタトクカシーー」

「「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.」

t1 = 'パトカー'
t2 = 'タクシー'
new = ''

for i in range(4):
  new += t1[i]
  new += t2[i]
new
##結果
'パタトクカシーー'

今回は4文字ずつなのでfor文を使って4回「i」番目の文字を「new」に加えていきました。

03.円周率

「「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.」

sentence = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
#「,」「.」を取り除きたい
import re
_sentence = re.sub("[^a-zA-Z]"," ", sentence)
# 単語に区切る
list = _sentence.split()
# 単語の時数を数えてリストにする
list2 = []
for i in list:
  list2.append(len(i))
list2
##結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

「,」「.」などの余分な文字を無くす方法は色々あります。
今回は以前のブログで使用していたre.sub()を使いました。

04.元素記号

「“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.」

elements = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
#「,」「.」を取り除き、単語に分ける。
import re
_elements = re.sub("[^a-zA-Z]"," ", elements)
_elements = _elements.split()
# for文の中でenumerate()を使ってインデックス番号を取得する。
# 取得したインデックスと要素をひとまずリストにしまう。
list_e = []
list_num = []
for i, element in enumerate(_elements, 1):
  list_num.append(i)
  list_e.append(element)
# 頭文字1文字にする奴と2文字にする奴を変換。
# 辞書にしまう。
d = {}
for h, g in zip(list_num, list_e):
  if h in [1, 5, 6, 7, 8, 9, 15, 16, 19]:
    d.update([(h, g[0])])
  else:
    d.update([(h, g[:2])])
print(d)
## 結果
{1: 'H', 2: 'He', 3: 'Li', 4: 'Be', 5: 'B', 6: 'C', 7: 'N', 8: 'O', 9: 'F', 10: 'Ne', 11: 'Na', 12: 'Mi', 13: 'Al', 14: 'Si', 15: 'P', 16: 'S', 17: 'Cl', 18: 'Ar', 19: 'K', 20: 'Ca'}


ひとまず5題。
残り95題です・・・!