2018年06月12日

言語処理100本ノックでPython入門 #51 - 英文テキスト 単語の切り出し

  

今日は、言語処理100本ノック 2015の第6章・問題51を解きます。

■ 問題

51. 単語の切り出し
空白を単語の区切りとみなし,50の出力を入力として受け取り,1行1単語の形式で出力せよ.ただし,文の終端では空行を出力せよ.


■ Pythonのコード
import re

def enumWords():
    with open('result50.txt', 'r', encoding='utf8') as fin:
        for line in fin:
            words = re.split(r'[\s\.",:;()]+', line)
            for w in words:
                if re.match(r'^[a-zA-Z]', w):
                    yield w

def main():
    with open('result51.txt', 'w', encoding='utf8') as w:
        w.writelines([x + '\n' for x in enumWords()])

if __name__ == '__main__':
    main()


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


■ ちょっと説明

単純に空白を区切り文字としてプログラム書いて実行して結果をみると、出力ファイルの中に以下のような内容がありました。
In
1950,
Alan
Turing
published
an
article
titled
"Computing
Machinery
and
Intelligence"
which
...

なんか、常識的に考えておかしいです。
「空白を単語の区切り」とあるけど、, " ( ) ? などの記号をどうしたらよいかは、問題読んでもよくわからないんですよね。

ということで、単語の区切りとなりそうな空白以外の記号も区切り記号として書き直したのが上のコードです。

それと、今回初めて、writelinesメソッド使ってみました。これで一気に複数行をファイルに出力できます。 でも、引数の配列の各行の最後に改行入れないといけないのが面倒です。
with open('result51.txt', 'w', encoding='utf8') as w:
    w.writelines([x + '\n' for x in enumWords()])

■ 結果

先頭の30語だけ掲載します。
Natural
language
processing
From
Wikipedia
the
free
encyclopedia
Natural
language
processing
NLP
is
a
field
of
computer
science
artificial
intelligence
and
linguistics
concerned
with
the
interactions
between
computers
and
human