2018年06月10日

言語処理100本ノックでPython入門 #50 - 英文テキスト 分区切り

  

本日から、言語処理100本ノック 2015の第6章に入ります。

まずは、問題50を解きます。

■ 問題
第6章: 英語テキストの処理
英語のテキスト(nlp.txt)に対して,以下の処理を実行せよ.
50. 文区切り
(. or ; or : or ? or !) → 空白文字 → 英大文字というパターンを文の区切りと見なし,入力された文書を1行1文の形式で出力せよ.

■ Pythonのコード
import re

def enumSentence():
    with open('nlp.txt', 'r', encoding='utf8') as fin:
        for line in fin:
            nl = re.sub(r'(\.|;|:|\?|!)(\s+)([A-Z])', r'\1\n\3', line)
            ss = re.split(r'\n', nl)
            for s in filter(lambda w: len(w) > 0, ss):
                yield s

def main():
    with open('result501.txt', 'w', encoding='utf8') as w:
        for sentence in enumSentence():
            w.write(sentence + '\n')

if __name__ == '__main__':
    main()

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

■ ちょっと説明

matchで1文を抜き出そうとしたのですが、文の途中に.がある場合や、引用符の中に、(. or ; or : or ? or !) → 空白文字 → 英大文字 という パターンがある場合に正規表現がうまく書けませんでした。

それなので、考えるのやめて安易な方法でやることにしました。

sub関数で文の区切りの空白を\nに置き換えて、\nでsplitして、1行を取り出すという戦術。

でも、この時、subじゃなくて、reaplceと書いてうまくいかずに、なぜ?って思ってしまいました。 substitute の略だと思うけど、どうも忘れてしまいます。 グループ化した文字列を参照するときは、\1, \2, \3 など使います。

それと、正規表現書く時は、rで始める文字列にしたほうが使いやすいですね。 


それと久しぶりにfilter使ってみました。たまに使わないと忘れてしまいそうです。
for s in filter(lambda w: len(w) > 0, ss):
    yield s
ちなみに、入力ファイルの先頭行の
Natural language processing
は、(. or ; or : or ? or !)で終わってないけど、これも文として扱うことにします。


■結果

先頭部分だけ載せます。画面だと途中で改行されてますが、ご容赦を。

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 (natural) languages.
As such, NLP is related to the area of humani-computer interaction.
Many challenges in NLP involve natural language understanding, that is, enabling computers to derive meaning from human or natural language input, and others involve natural language generation.
History
The history of NLP generally starts in the 1950s, although work can be found from earlier periods.
In 1950, Alan Turing published an article titled "Computing Machinery and Intelligence" which proposed what is now called the Turing test as a criterion of intelligence.
The Georgetown experiment in 1954 involved fully automatic translation of more than sixty Russian sentences into English.
The authors claimed that within three or five years, machine translation would be a solved problem.
...