LoginSignup
9
8

More than 5 years have passed since last update.

Pythonで単語N-gramを生成するモジュール

Last updated at Posted at 2016-04-10

目的

任意のテキストファイルを入力として,それについてN-gramの生成を行う.
今回生成するのは 単語 N-gram.

データセット

e.g. ニュース記事

下記のような記事についてN-gramの生成を行う.
記事はプログラムのあるディレクトリからみて,./data/news.txtにあるとする.

宇宙開発の常識を覆したとも言える成果で、打ち上げコストを下げる画期的な技術として注目されています。
ロケットの打ち上げに成功したあと、フロリダ州のケネディ宇宙センターで開かれた会見で、スペースX社のCEO=最高経営責任者、イーロン・マスク氏は「ロケットを戻すことが可能
だと証明できた」と述べ、実験が成功したことへの喜びを表しました。そのうえで、今回戻ってきたロケットに異常がないかどうか、地上でも実験を行い、問題がなければ、来月か再来月
には同じロケットを再び打ち上げるとコメントし、「ロケットは将来的には何千回も再利用ができるだろうが、現状では10回から20回程度は可能だと思う。ほかのロケットも含めて、
将来的にはすべてのロケットは再利用が当たり前になるだろう」と、今後の展望についての考えを示しました。

プログラム

text2bowは文章を単語集合に変換する関数でファイルを入力とする場合はmod="file"とする.
文字列を入力とする場合はmod="str"と指定する.(モジュールとして使用する場合はこちらのほうが多いかもしれない)

ngram.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import commands as cmd

# テキスト -> 単語(形態素)集合
def text2bow(obj,mod):

    # input: ファイルの場合はmod="file", input: 文字列の場合はmod="str"
    if mod == "file":
        morp = cmd.getstatusoutput("cat " + obj + " | mecab -Owakati")
    elif mod == "str":
        morp = cmd.getstatusoutput("echo " + obj.encode('utf-8') + " | mecab -Owakati")
    else:
        print "error!!"
        sys.exit(0)

    words = morp[1].decode('utf-8')
    words = words.replace('\n','')

    bow = words.split(' ')

    return bow

# N-gramの生成
def gen_Ngram(words,N):

    ngram = []

    for i in range(len(words)):
        cw = ""

        if i >= N-1:
            for j in reversed(range(N)):
                cw += words[i-j]
        else:
            continue

        ngram.append(cw)

    return ngram

# 出力
def output_Ngram(ngram):

    for i in range(len(ngram)):
        print ngram[i].encode('utf-8')

def main():

    argvs = sys.argv

    # input: ファイルの場合
    bow = text2bow(argvs[2],mod="file")

    # input: 文字列の場合
    #bow = text2bow(obj=u"これはN-gramを生成するプログラムです.",mod="str")

    ngram = gen_Ngram(bow,int(argvs[1]))

    output_Ngram(ngram)

if __name__ == "__main__":

    main()

実行方法

一応,今回はテキストファイルを入力として渡すことを前提とする.(プログラム中の文字列を入力とする場合は,ngram.pyをimportして各種メソッドを使用する.text2bowのmodの値だけ注意する)
実行方法は下記の通り.

ngram.py
$ python ngram.py N textfile
  • N: 任意の数 (e.g. 2-gram -> N=2)
  • textfile: 入力とするテキストファイルのファイルパス

実行

上記ニュース記事の2-gramを出力.

ngram.py
$ python ngram.py 2 data/news.txt

出力結果

宇宙開発
開発の
の常識
常識を
を覆し
覆した
たと
とも
も言える
...

上記のような出力を得ることが出来ればOK.

まとめ

今回はPythonで単語N-gramを扱えるプログラムを作成した.
モジュールとして扱うには,プログラムをimportして各メソッドを使う.
汎用性を考えて作ったつもりなので,importしてお手軽に使えるかと思う.

9
8
0

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
9
8