2018年04月25日

言語処理100本ノックでPython入門 #39 - matplotlibで散布図を作成


いよいよ言語処理100本ノック 2015の第4章最後の問題39です。

■ 問題


夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

39. Zipfの法則
単語の出現頻度順位を横軸,その出現頻度を縦軸として,両対数グラフをプロットせよ.

■ Pythonのコード

import re
import re
import matplotlib.pyplot as plt
 
def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines
 
def getFrequency(lines):
    words = {}
    for sentense in lines:
        for word in sentense:
            if word['surface'] in words.keys():
                words[word['surface']] += 1
            else:
                words[word['surface']] = 1
    return words
 
def getScatterData(words):
    data = [x[1] for x in words.items()]
    data = sorted(data, key=lambda x: x, reverse=True)
    return range(1, len(data)+1), data
 
def plotScatter(x, y):
    plt.rcParams['font.family'] = 'Meiryo'  
    plt.scatter(x, y, s=2)
    plt.xscale("log")
    plt.yscale("log")
 
    plt.xlabel('出現頻度順位')
    plt.ylabel('出現頻度')
    plt.show()
 
def main():
    article = analyze()
    words = getFrequency(article)
    x, y = getScatterData(words)
 
    plotScatter(x, y)
 
if __name__ == '__main__':
    main()

ソースコードは、GitHubで公開しています。

■ 散布図を描く

以下のようにして両対数目盛の散布図を描いています。
plt.scatter(x, y, s=2)
plt.xscale("log")
plt.yscale("log")

軸を対数目盛にするには、xscale('log"0),yscale('log"0) を使います。

散布図は、scatter(x, y, s=2) です。

sは点のサイズを表しています。 Pythonは関数で複数の値を返すのが簡単で良いですね。

ところで、Zipfの法則ってなに?

Wikipediaによると

ジップの法則(ジップのほうそく、Zipf's law)あるいはジフの法則とは、出現頻度が k 番目に大きい要素が全体に占める割合が 1/k に比例するという経験則である。Zipf は「ジフ」と読まれることもある。また、この法則が機能する世界を「ジフ構造」と記する論者もいる。

とのことらしいです。 2番目の出現頻度は、1/2 3番目は1/3, 4番目は、1/4となるという法則ということですね。

■ 結果

nlp39

第4章もこれで終わりです。いよいよ第5章。やっとクラスを使います。
   

Posted by gushwell at 22:30Comments(0)

2018年04月22日

言語処理100本ノックでPython入門 #38 - matplotlibでヒストグラム

今日は言語処理100本ノック 2015の問題38です。

■ 問題
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

38. ヒストグラム
単語の出現頻度のヒストグラム(横軸に出現頻度,縦軸に出現頻度をとる単語の種類数を棒グラフで表したもの)を描け.


No37で求めた、単語の出現数のデータをさらに加工して、出現する単語の数を求め、それを元にグラフを描いています。


■ Pythonのコード
import re
import matplotlib.pyplot as plt
 
def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines
 
def getFrequency(lines):
    words = {}
    for sentense in lines:
        for word in sentense:
            if word['pos'] == '記号':
                continue
            if word['surface'] in words.keys():
                words[word['surface']] += 1
            else:
                words[word['surface']] = 1
    return words
 
def getHistogramData(words):
    hist = {}
    for word in words.items():
        if word[1] in hist.keys():
            hist[word[1]] += 1
        else:
            hist[word[1]] = 1
    return words
 
def plotHistgram(data):
    xs = [x[1] for x in data]

    plt.rcParams['font.family'] = 'Meiryo' 
 
    plt.hist(xs, bins=25, range=(1, 25))
    plt.xlim(xmin=1, xmax=25)
    plt.xlabel('単語の出現頻度')
    plt.ylabel('単語の種類数')
    plt.show()
 
def main():
    article = analyze()
    words = getFrequency(article)
    histData = getHistogramData(words)
    sortedData = sorted(histData.items(), key=lambda x: x[1], reverse=True)
    print(sortedData[0:20])

    plotHistgram(sortedData)
 
if __name__ == '__main__':
    main()

ソースコードは、GitHubで公開しています。

■ ヒストグラムの描画

plotHistgram関数が、ヒストグラムを描画している関数です。

最初に書いたコードだと、なんとほとんどの単語が1回しか現れませんでした。 そのため、デフォルト設定のままhistメソッドを呼び出すと、まったく意味のわからないグラフになっていたので、range引数を指定して範囲を上位1-25に限定しました。

X軸は
plt.xlim(xmin=1, xmax=25)
で、範囲を設定できます。

Y軸のタイトルは縦書きにしたかったのですが、やり方がわかりませんでした。

■ 結果
nlp38

グラフ描画とともに、出現頻度の多い単語を20個表示しています。
 
[('の', 9194), ('て', 6868), ('は', 6420), ('に', 6243), ('を', 6071), ('と', 5508), ('が', 5337), ('た', 3988), ('で', 3806), ('も', 2479), ('ない', 2390), ('だ', 2363), ('し', 2322), ('から', 2032), ('ある', 1728), ('な', 1613), ('ん', 1568), ('か', 1530), ('いる', 1249), ('事', 1207)]
  
Posted by gushwell at 22:00Comments(0)

2018年04月18日

言語処理100本ノックでPython入門 #37 - matplotlibで棒グラフ作成

言語処理100本ノック 2015の問題37に挑戦です。

■ 問題
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

37. 頻度上位10語
出現頻度が高い10語とその出現頻度をグラフ(例えば棒グラフなど)で表示せよ.


■ Pythonのコード
import re
import matplotlib.pyplot as plt

def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines

def getFrequency(lines):
    words = {}
    for sentense in lines:
        for word in sentense:
            if word['pos'] == '記号':
                continue
            if word['surface'] in words.keys():
                words[word['surface']] += 1
            else:
                words[word['surface']] = 1
    return words

def plotBarChart(sortedwords):
    categories = [x[0] for x in sortedwords]
    xaxis = [x for x in range(10)]
    values = [x[1] for x in sortedwords]

    #plt.rcParams['font.family'] = 'AppleGothic' 
    plt.rcParams['font.family'] = 'Meiryo' 

    plt.bar(xaxis, values)
    plt.xticks(xaxis, categories)
    plt.show()

def main():
    article = analyze()
    words = getFrequency(article)
    sortedwords = sorted(words.items(), key=lambda x: x[1], reverse=True)[0:10]
    print(sortedwords)
    plotBarChart(sortedwords)

if __name__ == '__main__':
    main() 

■ matplotlib.pyplotを使う


まずは、anacondaのcondaコマンドを使って、macに、matplotlibをインストールします。
$ conda install matplotlib

インストールしている途中で、以下のメッセージが出てきたので、y を押します
The following packages will be UPDATED:

    anaconda:   4.3.1-np111py36_0 --> custom-py36_0
    conda:      4.3.14-py36_0     --> 4.3.30-py36h173c244_0
    matplotlib: 2.0.0-np111py36_0 --> 2.0.2-np111py36_0

Proceed ([y]/n)? y

無事インストールできたので、matplotlib.pyplotをimportします。
    import matplotlib.pyplot as plt
これで、pltという名前で利用できるようになります。

実際にグラフを書いているのはplotBarChartメソッド内です。barメソッドでチャートを描いています。 

初めは、以下のように書いてみました。
categories = [x[0] for x in sortedwords]
xaxis = [x for x in range(10)]
values = [x[1] for x in sortedwords]

plt.bar(xaxis, values)
plt.xticks(xaxis, categories)
plt.show()
でも、日本語が文字化けしてしまいます。


■ matplotlibの文字化け対応

matplotlibの環境設定でフォントを日本語にするという方法もあるようですが、ここではコードだけで対応することにします。

まず、
import matplotlib.font_manager as fm
print([f.name for f in fm.fontManager.ttflist])
で、matplotlib利用できるフォント一覧を表示してみます。

僕の環境では’Meiryo’フォントがありますのでこれを使います。 たぶん、Microsoft Officeをインストールしているからかな。
そのほか、AppleGothicというフォントも日本語が表示できるようです。

メイリオフォントが使えることがわかったので、以下のように1行追加するだけで、日本語化することができました。
plt.rcParams['font.family'] =  ‘Meiryo’  // これを追加

plt.bar(xaxis, values)
plt.xticks(xaxis, categories)
plt.show()

どこまで、見た目をカスタマイズできるのかわからないけど、簡単にグラフが書けるのは便利ですね。


■ 結果
nlp37


出現頻度が高い10語とその出現頻度をコンソールにも表示しています。
[('の', 9194), ('て', 6868), ('は', 6420), ('に', 6243), ('を', 6071), ('と', 5508), ('が', 5337), ('た', 3988), ('で', 3806), ('も', 2479)]

  
Posted by gushwell at 22:30Comments(0)

2018年04月15日

言語処理100本ノックでPython入門 #36 - 辞書型の操作


言語処理100本ノック 2015
の問題36に挑戦です。


■ 問題


夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

36. 単語の出現頻度
文章中に出現する単語とその出現頻度を求め,出現頻度の高い順に並べよ.


単語の定義がわかりません。形態素解析で得られた一つ一つが単語ということで良いかな。となると、句点、読点も単語だけど... いちおう、記号だけは除外することにします。


■Pythonのコード

import re

def analyze():
    lines = []
    sentence = []
    with open('chap04/neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines

def getFrequency(lines):
    words = {}
    for sentense in lines:
        for word in sentense:
            if word['pos'] == '記号':
                continue
            if word['surface'] in words.keys():
                words[word['surface']] += 1
            else:
                words[word['surface']] = 1
    return words

def main():
    article = analyze()
    words = getFrequency(article)
    sortedwords = sorted(words.items(), key=lambda x: x[1], reverse=True)
    for i in range(0, 100):
        print(i, sortedwords[i][0], sortedwords[i][1])

if __name__ == '__main__':
    main()

■ 辞書の操作

辞書のキーが存在しているかは、in キーワードが使えます。
if word['surface'] in words:

次の書き方でも良いみたいです。
if word['surface'] in words.keys():


辞書の値を使ってのソートは、前にも出てきたような気がするけど、以下のように書けばOKです。
sortedwords = sorted(words.items(), key=lambda x: x[1], reverse=True)
最後の引数で、逆順にソートしています。
このコードでは、words.items() をソートしているので、ソートの結果は辞書ではなくリストになります。

最初の100個を表示してみます。
for i in range(0, 100):
    print(i, sortedwords[i][0], sortedwords[i][1])

■ 結果
0 の 9194
1 て 6868
2 は 6420
3 に 6243
4 を 6071
5 と 5508
6 が 5337
7 た 3988
8 で 3806
9 も 2479
10 ない 2390
11 だ 2363
12 し 2322
13 から 2032
14 ある 1728
15 な 1613
16 ん 1568
17 か 1530
18 いる 1249
19 事 1207
20 へ 1034
21 う 992
22 する 992
23 もの 981
24 君 973
25 です 973
26 云う 937
27 主人 932
28 よう 696
29 ね 683
30 この 649
31 御 636
32 ば 617
33 人 602
34 その 576
35 一 554
36 そう 546
37 何 539
38 なる 531
39 さ 514
40 よ 509
41 なら 483
42 吾輩 481
44 ます 458
45 じゃ 448
46 これ 414
47 なっ 404
48 それ 381
49 来 364
50 れ 356
51 見 350
52 でも 346
53 時 345
54 迷亭 343
55 ませ 330
56 いい 320
57 三 319
58 —— 319
59 まで 313
60 ところ 313
61 方 312
62 二 303
63 ず 299
64 上 294
65 まし 289
66 寒月 286
67 顔 282
68 ぬ 277
69 先生 274
70 見る 273
71 人間 272
72 だろ 270
73 くらい 269
74 僕 268
75 たら 262
76 さん 260
77 なく 258
78 気 250
79 あり 249
80 猫 248
81 だけ 246
82 出 245
83 出来 244
84 云っ 241
85 また 238
86 中 234
87 思っ 232
88 ばかり 231
89 十 231
90 ごとく 225
91 あっ 221
92 どう 220
93 って 216
94 細君 213
95 など 205
96 鼻 199
97 今 195
98 大 195
99 や 194
  
Posted by gushwell at 21:19Comments(0)

2018年04月12日

言語処理100本ノックでPython入門 #35 - 名詞の連接

言語処理100本ノック 2015の問題35に挑戦です。

■ 問題
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

35. 名詞の連接
名詞の連接(連続して出現する名詞)を最長一致で抽出せよ.

■ Pythonのコード
import re

def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines

def extractContinuousNouns(lines):
    for sentense in lines:
        noun = ''
        count = 0
        for word in sentense:
            if word['pos'] == '名詞' and (noun != '' or word['pos1'] != '副詞可能'):
                noun += word['surface']
                count += 1
            else:
                if count > 1:
                    yield noun
                noun = ''
                count = 0

def main():
    article = analyze()
    nouns = [surface for surface in extractContinuousNouns(article)]
    print(nouns)

if __name__ == '__main__':
    main()

■ ちょっと説明

単純に名詞の連続だと
'その後猫'  'この間おさん'  '自ら筆'  '元来放蕩家' 
などちょっとおかしな単語も引っ張ってきてしまっているので、連続した名詞の先頭のpos1が副詞可能な場合を除外してみました。

しかし、そうすると、 '前後不覚'  'ふだん着' などいくつか除外してほしくない単語も除外されてしまいました。 まあどっちもどっちですね。

この精度を高めようとすると、辞書登録をするしかないですかね。
それとも、pos2の内容もみて条件判定をするといった泥臭いコードを書く必要があるのでしょうか。

それと、ひさしぶりに if else 使いました。elseにの後ろにも:付けるんだった。すっかり忘れていました。


■ 結果

結果の先頭部分を載せます。
['人間中', '時妙', '一毛', '一度', 'ぷうぷうと煙', '邸内', '三毛', '書生以外', '四五遍', '三馬', '御台所', 'まま奥', '住家', '勉強家', '勉強家', '勤勉家', '二三ページ', '主人以外', '限り吾輩', '二人', '一つ床', '一人', '最後大変', '——猫', '神経胃弱性', '物指', '尻ぺたをひどく', '言語同断',
あまり良い結果とは言えないです。

「ぶうぶうと煙」は、どう考えても名詞の連結とは言えないよなー。
   
Posted by gushwell at 22:30Comments(0)

2018年04月09日

『業務システム開発モダナイゼーションガイド』とても良い本です

今年の2月に日経BP社から発売された『業務システム開発モダナイゼーションガイド 非効率な日本のSIを変革する実践的ベストプラクティス』を読み終わりました。

マイクロソフトコンサルティング本部で長年SI業界の開発現場を見てきた著者だから書ける渾身の一冊です。


赤間信幸(著)
日経BP社

本書は、主に、企業のIT部門、Sierおよびその関連企業でソフトウェア開発に関わる人々を対象にした本で、タイトルの通り、業務システム開発をいかに正しい方向に導き、開発現場を近代化できるようにしたら良いかを説いた内容となっています。

日本のSI業界が抱える問題点をどう改善しソフトウェア開発を進化させたら良いのか悩んでいる方には、得るものがたくさんあると思います。

エンジニアだけではなく、マネジメント層の方にも是非読んでほしい本です。
要件定義から設計、実装、テストといった各工程で何をやったら良いかの指針が示されています。

この本を読んで好感が持てるのは、理想論や頭でっかちの理論で「ソフトウェア開発はこうあるべき」と論じるのではなく、現実を直視し、コストと開発効率と品質のバランスを取り、やらなくて良いものはやらないという潔さがある点です。 そして、なぜそうするのか、何のためにそうするのかというWhyとWhatに焦点を当てている点です。

著者の赤間さんがマイクロソフトコンサルタントということもあり、MS製品を例に取っている箇所も多いですが、それは本質的な部分ではないので、MS製品を使った開発をしていない方にも十分読む価値があると思います。

筆者のIT業界を良くしたいという思いが伝わってくる本です。

    
Posted by gushwell at 21:30Comments(0)

2018年04月08日

言語処理100本ノックでPython入門 #34 - namedtuple

言語処理100本ノック 2015の問題34に挑戦です。

■ 問題
夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

34. 「AのB」
2つの名詞が「の」で連結されている名詞句を抽出せよ.
---

この問題は、入力ファイルの中から以下のようなものを見つけるということですね。
書生    名詞,一般,*,*,*,*,書生,ショセイ,ショセイ
の    助詞,連体化,*,*,*,*,の,ノ,ノ
顔    名詞,一般,*,*,*,*,顔,カオ,カオ

■ Pythonのコード
import re
from collections import namedtuple

def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines

def extractNounphrases(lines):
    Morpheme = namedtuple('Morpheme', ['surface', 'pos'])
    for sentense in lines:
        prev2 = Morpheme('', '')
        prev1 = Morpheme('', '')
        for word in sentense:
            if word['pos'] == '名詞' and prev1.surface == 'の' and \
               prev1.pos == '助詞' and prev2.pos == '名詞':
                yield prev2.surface + prev1.surface + word['surface']
            prev2 = prev1
            prev1 = Morpheme(word['surface'], word['pos'])

def main():
    article = analyze()
    nouns = [surface for surface in extractNounphrases(article)]
    print(nouns[:50])

if __name__ == '__main__':
    main()

■ namedtuple


あまりスマートなやり方とは思えませんが、2行前までの情報を覚えておいて、「の」でつながる名詞句を求めています。

変数prev2が2つ前、prev1が一つ前の情報で、表層形と品詞を記憶するのにnamedtupleを使っています。 namedtupleは、その名の通り、フィールドに名前が付いたタプルです。

Pythonについて何か新しい知識を得ようと、Webをうろうろしていたらnamedtupleというのがあることを知りました。 この問題でも使えそうなので早速使ってみました。
from collections import namedtuple
でnamedtupleをインポートして、
Morpheme = namedtuple('Morpheme', ['surface', 'pos'])
とすると、namedtupleを定義できます。

上のコードは、Morphemeという名前のタプルを定義しています。 なんで、第1引数が必要なのか疑問ですが、そういうものなのだと納得することにします。 第2引数で、'surface' と 'pos'というフィールドメンバーを持つことを指定しています。 オブジェクトを作成するには、以下のように記述します。
item = Morpheme('吾輩','名詞')
これで、item.surfaceに'吾輩'が、item.posに'名詞'が設定されます。


■ 結果

結果は先頭の50個を表示しています。
['彼の掌', '掌の上', '書生の顔', 'はずの顔', '顔の真中', '穴の中', '書生の掌', '掌の裏', '何の事', '肝心の母親', '藁の上', '笹原の中', '池の前', '池の上', '一樹の蔭', '垣根の穴', '隣家の三', '時の通路', '一刻の猶予', '家の内', '彼の書生', '以外の人間', '前の書生', 'おさんの隙', 'おさんの三', '胸の痞', '家の主人', '主人の方', '鼻の下', '吾輩の顔', '自分の住', '吾輩の主人', '家のもの', 'うちのもの', '彼の書斎', '本の上', '皮膚の色', '本の上', '彼の毎夜', '以外のもの', '主人の傍', '彼の膝', '膝の上', '経験の上', '飯櫃の上', '炬燵の上', 'ここのうち', '供の寝床', '彼等の中間', '供の一']

  
Posted by gushwell at 21:47Comments(0)

2018年04月05日

言語処理100本ノックでPython入門 #33 - サ変接続の名詞

言語処理100本ノック 2015の問題33に挑戦です。

■ 問題


夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をMeCabを使って形態素解析し,その結果をneko.txt.mecabというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ. なお,問題37, 38, 39はmatplotlibもしくはGnuplotを用いるとよい.

33. サ変名詞
サ変接続の名詞をすべて抽出せよ.


■ Pythonのコード
import re

def analyze():
    lines = []
    sentence = []
    with open('neko.txt.mecab', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'\t|,|\n', line)
            if words[0] == 'EOS':
                if sentence:
                    lines.append(sentence)
                    sentence = []
                continue
            sentence.append({
                "surface": words[0],
                "base": words[7],
                "pos": words[1],
                "pos1": words[2],
            })
    return lines

def extractNouns(lines):
    for sentense in lines:
        seq = filter(lambda w: w['pos'] == '名詞' and w['pos1'] == 'サ変接続', sentense)
        yield from map(lambda w: w['surface'], seq)

def main():
    article = analyze()
    nouns = [surface for surface in extractNouns(article)]
    print(nouns[:50])

if __name__ == '__main__':
    main()


書いたコードについては、前回とほとんど同じなので、特筆すべき点はないです。

ラムダ式が少し複雑になったけど、タプルではなくて文字列を列挙しているので、プログラミングの観点からは、こちらのほうが易しいですね。

論理演算子の論理積が&&じゃなくてandなのがどうも面倒です。いつも&&と書いてエラーになっています。

ところで、このところ新しいし知識を仕入れなくても問題を解くことができるようになってきました。 文法で主要なのはあとはクラスくらいでしょうか? No.33以降の問題文を見てみると、第5章にクラスを実装せよという問題があるので、それまではクラスを使わずに解いていこうと思います。


■ 結果

プログラムでは取り出した先頭50個を表示しています。
なるほど、こういったものが、サ変接続の名詞なのか。
['見当', '記憶', '話', '装飾', '突起', '運転', '記憶', '分別', '決心', '我慢', '餓死', '訪問', '始末', '猶予', '遭遇', '我慢', '記憶', '返報', '勉強', '勉強', '昼寝', '珍重', '昼寝', '経験', '供', '供', '供', '供', '——', '——', '同居', '観察', '断言', '同衾', '供', '迫害', '尊敬', '生活', '剿滅', '議論', '所有', '憤慨', '観念', '御馳走', '掠奪', '代言', '我儘', '我儘', '失敗', '話']
  
Posted by gushwell at 22:10Comments(0)