LoginSignup
3

More than 5 years have passed since last update.

言語処理100本ノック 03 ~ 05

Last updated at Posted at 2015-08-03

03. 円周率
"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

nlp03.py
#! usr/bin/env python
from collections import Counter 
str = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics'
li = []
count = Counter(map(len,str.split())).most_common()
for i in range(len(count)):
    li.append(count[i][0])
print(li)

実行結果
[9, 1, 3, 5, 7, 2, 4, 6, 8]

forループを使わずに実装する方法がわかりませんでした。

03円周率 変更
ご指摘をいただいた間違えている部分を訂正します。ご指摘ありがとうございます。
問題を読み間違えて、文字数の出現率が高い文字数を出力するプログラムを書いてしまいました。それと、,や.も文から削除していませんでした。

nlp03re.py
#!usr/bin/env python
seq = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
seq = seq.replace(",","").replace(".","")
words = seq.split()
count =[]
for i in words:
    count.append(len(i))
print count 

実行結果
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

円周率になりました。
","や"."を省く部分がもっといい書き方があると思うんですが、、、

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文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

nlp04.py
#!usr/bin/env python
str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict = {}
strsp = str.split()
for i in range(len(strsp)):
    word = strsp[i]
    if i in number:
        dict[word[0:2]] = i
    else:
        dict[word[0:1]] = i
print(dict)

実行結果
{'A': 17, 'B': 4, 'Co': 5, 'No': 6, 'H': 0, 'K': 18, 'Cl': 16, 'M': 11, 'L': 2, 'Ne': 9, 'P': 14, 'S': 13, 'Ox': 7, 'N': 10, 'Fl': 8, 'Ca': 19, 'Se': 15, 'He': 1}

04元素記号 修正
ご指摘をいただいた部分を修正しました。
この課題も,と.を省かなければいけなかったことと、順番のカウントが0ベースになっていた部分を修正しました。
さらに、位置情報をdictの値としなければならないところが単語の長さになっていた部分を修正しました。

nlp04.py
#!usr/bin/env python
str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict = {}
words = str.replace(","," ").replace("."," ").split()
for (i,word) in enumerate(words,1):
    if i in number:
        dict[word[0:1]] = i
    else:
        dict[word[0:2]] = i
print(dict)

実行結果
{'Be': 7, 'C': 5, 'B': 5, 'Ca': 3, 'F': 8, 'S': 8, 'H': 2, 'K': 4, 'Al': 4, 'Mi': 5, 'Ne': 3, 'O': 7, 'Li': 4, 'P': 5, 'Si': 4, 'Ar': 6, 'Na': 7, 'N': 3, 'Cl': 6, 'He': 2}

05. n-gram
与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

nlp05.py
#! usr/bin/env python
def word_ngram(n,seq):
    li = []
    for i in range(len(seq.split())+1-n):
        li.append(seq.split()[i:i+n])
    return li
def char_ngram(n,seq):
    li = []
    for i in range(len(seq)):
        li.append(seq[i:i+n])
    return li
str = "I am an NLPer"
print(word_ngram(2,str))
print(char_ngram(2,str))

実行結果
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]
['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er', 'r']

文字bigramは空白も一文字と考えてます。

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
3