prettyprintで表の作成
詳細はこちら:https://pypi.python.org/pypi/PrettyTable
下記のものをpipでインストールしました。
listの各要素の長さがバラバラで、出力してみても見にくい時とかに便利です。
今回のコード:https://github.com/KodairaTomonori/Qiita/blob/master/module/prettyprint/make_table.py
$ pip search prettytable
prettytable-extras - An extension to the excellent prettytable Python library
実際に作ってみる
今回は形態素解析をしてくれるmecab
をつかって説明していきます。
mecabは、文を入れると、形態素解析結果を文字列として返してくれます。
こちらも簡単にpipでインストールできます。
$ python
Python 3.5.0
>>> import MeCab
>>> MeCab.Tagger().parse('体は剣で出来ている')
'体\t名詞,一般,*,*,*,*,体,カラダ,カラダ\nは\t助詞,係助詞,*,*,*,*,は,ハ,ワ\n剣\t名詞,一般,*,*,*,*,剣,ケン,ケン\nで\t助詞,格助詞,一般,*,*,*,で,デ,デ\n出来\t動詞,自立,*,*,一段,連用形,出来る,デキ,デキ\nて\t助詞,接続助詞,*,*,*,*,て,テ,テ\nいる\t動詞,非自立,*,*,一段,基本形,いる,イル,イル\nEOS\n'
>>> print(MeCab.Tagger().parse('体は剣で出来ている') )
体 名詞,一般,*,*,*,*,体,カラダ,カラダ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
剣 名詞,一般,*,*,*,*,剣,ケン,ケン
で 助詞,格助詞,一般,*,*,*,で,デ,デ
出来 動詞,自立,*,*,一段,連用形,出来る,デキ,デキ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル
EOS
こんな感じで出力されますが、ただプリントしただけでは、何か後ろの方が揃ってなくて見にくい
なので、prettytable
をつかってこれを簡単に見やすくしたいと思います。
import MeCab
import prettytable
def make_prettytable(others, header=[]):
if not header: header = range(len(list(others)[0]) )
if len(header) != len(others[0]):
print('incorrect length!')
return
table = prettytable.PrettyTable(header)
for other in others: table.add_row(other)
return table
def make_mecab_info_table(sentence, output_info=[], \
mecab_parser=MeCab.Tagger.parse):
others = list(map(lambda x: x.split(','), \
mecab_parser(sentence).replace('\t', ',').split('\n') ) )[:-2]
return make_prettytable(others, output_info)
if __name__ == '__main__':
mecab_output = '表層形,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音'
parser = MeCab.Tagger().parse
header = mecab_output.split(',')
print(make_mecab_info_table(input(), header, parser) )
出力例

解説
こんな感じで見やすくなりました。
make_prettytable
は最初の引数(others
)には中身を、次の引数(header
)には、上段の情報を入れています。
header
は引数を受けとんなかった場合に、range
で番号を振ってあげてます。
others
は[[1,2,...], [2,3,...]...]
的なリストを入れてあげればいいです。
prettytable.PrettyTable
で上段(header
)を入れて表の元を作ります。
次のfor
文でothers
を回して.add_row
で一行づつ追加して行っています。
あとは、printするだけで簡単に表が見れます。
make_mecab_info_tableは、普通に文字を処理しているだけです。
listの要素の長さがバラバラの時、出力して確認しようとしてもなんか見にくいのでそんな時に便利です。