目的
任意のテキストファイルを入力として,それについてN-gramの生成を行う.
今回生成するのは 単語 N-gram.
データセット
e.g. ニュース記事
下記のような記事についてN-gramの生成を行う.
記事はプログラムのあるディレクトリからみて,./data/news.txtにあるとする.
宇宙開発の常識を覆したとも言える成果で、打ち上げコストを下げる画期的な技術として注目されています。
ロケットの打ち上げに成功したあと、フロリダ州のケネディ宇宙センターで開かれた会見で、スペースX社のCEO=最高経営責任者、イーロン・マスク氏は「ロケットを戻すことが可能
だと証明できた」と述べ、実験が成功したことへの喜びを表しました。そのうえで、今回戻ってきたロケットに異常がないかどうか、地上でも実験を行い、問題がなければ、来月か再来月
には同じロケットを再び打ち上げるとコメントし、「ロケットは将来的には何千回も再利用ができるだろうが、現状では10回から20回程度は可能だと思う。ほかのロケットも含めて、
将来的にはすべてのロケットは再利用が当たり前になるだろう」と、今後の展望についての考えを示しました。
プログラム
text2bowは文章を単語集合に変換する関数でファイルを入力とする場合はmod="file"とする.
文字列を入力とする場合はmod="str"と指定する.(モジュールとして使用する場合はこちらのほうが多いかもしれない)
#!/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の値だけ注意する)
実行方法は下記の通り.
$ python ngram.py N textfile
- N: 任意の数 (e.g. 2-gram -> N=2)
- textfile: 入力とするテキストファイルのファイルパス
実行
上記ニュース記事の2-gramを出力.
$ python ngram.py 2 data/news.txt
出力結果
宇宙開発
開発の
の常識
常識を
を覆し
覆した
たと
とも
も言える
...
上記のような出力を得ることが出来ればOK.
まとめ
今回はPythonで単語N-gramを扱えるプログラムを作成した.
モジュールとして扱うには,プログラムをimportして各メソッドを使う.
汎用性を考えて作ったつもりなので,importしてお手軽に使えるかと思う.