Hatena::ブログ(Diary)

Sticker@Something

2011-03-23

[]gitのコミットログ編集用エディタをvimにする

今更な感がありますが最近gitを使い始めました。githubのアカウントも取得したので活用していきたいと思います。

で、コミット時のエディタをvimにする方法を忘れないようにメモ

git config --global core.editor 'vim -c "set fenc=utf-8"'

githubのwebページはutf-8のようなので、日本語ログが文字化けせずに読めるようエンコードはutf-8指定しておきます。

参考

2011-03-21

[]PythonからYahooキーフレーズ抽出WebAPIを使う

概要

Yahooから提供されているテキスト解析WebAPIの中のキーフレーズ抽出APIを使って、入力された任意の文からキーフレーズ(重要語句)を抽出してみました。

テキスト解析WebAPIの中には「日本語形態素解析API」などがありますが、単に入力文から特徴的な単語を抜き出したいだけであれば、「キーフレーズ抽出API」の方がシンプルで簡単だと思います。

結果の形式はXML、JSON、PHP Serializeから選択することが出来ます。今回はJSONで受け取ることにしました。

ソースコード

#coding:utf-8

import json
import urllib
import urllib2

#取得したアプリケーションIDを指定
appid = "***"

#キーフレーズ抽出APIのURL
pageurl = "http://jlp.yahooapis.jp/KeyphraseService/V1/extract"

#入力文
sentence = u"東日本大震災の影響で2度登板が流れ、実戦は6日の巨人戦以来、約2週間ぶり。それでも「試合で投げることに関して不安はない。調整が遅れているのは自分だけじゃない」と話していた斎藤だったが、プロの洗礼を浴びてしまった。斎藤は降板後「コントロールも良くなかったし、変化球の切れも良くなかった。"

def extract_keyphrase(sentence, id):
    sentence = urllib.quote_plus(sentence.encode("utf-8"))
    query = "%s?appid=%s&output=%s&sentence=%s" % (pageurl, id, "json", sentence)

    c = urllib2.urlopen(query)
    json_str = c.read()
    result = json.loads(json_str)

    return result

result = extract_keyphrase(sentence, id=appid)

#scoreの大きい順に表示
for k,v in sorted(result.items(), key=lambda x:x[1], reverse=True):
    print "keyphrase:%s, score:%d" % (k.encode("utf-8"), v)

実行結果

keyphrase:斎藤, score:100
keyphrase:東日本大震災, score:94
keyphrase:変化球, score:80
keyphrase:コントロール, score:76
keyphrase:洗礼, score:67
keyphrase:実戦, score:61
keyphrase:降板後, score:53
keyphrase:巨人戦, score:53
...(省略)

公式のドキュメントによると、キーワードと共に取得出来るスコアは以下のような値との事です。

Scoreは、重要度を示す目安の数値です。先頭のKeyphraseのScoreは100となり、以下相対的な重要度に応じて 100以下の値が割り当てられます。

参考

2011-03-10

[]Pythonのosモジュールを使ってシンボリックリンクを作成する

概要

pythonのosモジュールの関数を使ってシンボリックリンクを作成する方法です。

os.symlink(src, dst)
# src を指しているシンボリックリンクを dst に作成します。利用できる環境: Unix。

シンボリックリンクを作成するときに、よくどっちがsrcでどっちがdstか分からなくなるので、その辺を整理するためにまとめてみます。

コード(symlink.py)

# -*- coding: utf-8 -*-
import os
import sys

src = sys.argv[1]
dst = sys.argv[2]

# シンボリックリンク作成
#(src を指しているシンボリックリンクを dst に作成します)
os.symlink(src, dst)

使ってみる

  • ディレクトリ構成
 + test
    + symlink.py
    + module1
     + resource
    + module2
     + (ここからtest/module1/resourceにリンクをはる)
  • 実行例

 python symlink.py test/module1/resource test/module2/symlinkfile

これは、lnコマンドを以下のように実行したのと同じ意味です。

 ln -s test/module1/resource test/module2/symlinkfile

なお、lnコマンドでは、以下のようにシンボリックファイル名を省略した場合、自動的にリンク先のファイル名でシンボリックリンクが作成されます。(この例では、test/module2/resourceが作成される)

ln -s test/module1/resource test/module2

これに対して、pythonのsymlink関数ではシンボリックリンクのファイル名を省略するとエラーとなるようです。

python symlink.py test/module1/resource test/module2

Traceback (most recent call last):

File "symlink.py", line 14, in <module>

os.symlink(src, dst)

OSError: [Errno 17] File exists

また、シンボリックリンクの作成先に既に同名のファイルがある場合もエラーとなります。

(test/module2/symlinkfileが存在する状態で)

python symlink.py test/module1/resource test/module2/symlinkfile

Traceback (most recent call last):

File "symlink.py", line 14, in <module>

os.symlink(src, dst)

OSError: [Errno 17] File exists

lnコマンドの場合は-fオプションで強制的に上書き出来ますが、symlink関数の場合はそういう指定はないようなので、一旦ファイルを削除->シンボリックリンク作成という流れになると思います。

以上です。

参考リンク

2009-08-25

[]駄目なプレゼンテーションの11の特徴

最近、他人のプレゼンを聞く機会が多く、様々なプレゼンを聞いています。

分かり易いプレゼンもあれば、全く理解出来ないプレゼンもあったりするわけですが、プレゼンには人それぞれのスタイルがあるのでどのようなプレゼンが良い、と断定するのは難しいです。

しかし逆に、分かりづらいと感じる、または退屈だと感じるプレゼンには共通した特徴があるように思います。

ということで、個人的にこれは駄目だというプレゼンの特徴を以下にまとめてみました。

自分がプレゼンをする際には、これに該当しないように気をつけたいところ。

前半の5つはプレゼン資料に関する項目、後半の6つはプレゼン態度に関する項目です。


資料に記載されている日付がおかしい

プレゼン資料の最初のページに記載された発表日がおかしな資料。

この日付が去年のものだったりすると、去年の資料を使いまわしていることがバレバレ。

資料を使いまわすこと自体は悪いことではない。ただ、去年使った資料を見直しもせず(もちろんリハーサルも行わず)使いまわしているとなると聴衆にとってはあまり気分のいいものではない。

こういう発表は、発表者が昨年の資料を思い出しながら、歯切れの悪い感じで進んでいくことが多い。

図表が見づらい

図表が小さすぎる、または配色がおかしいなどの理由で見づらい資料。

発表中の「え〜、ちょっと図が見づらいですが」は禁句。

見づらいことを自覚しているなら、見やすいように修正して発表すべき。

重要そうな図表なのに、内容が全く把握できないと聴衆はストレスを感じる。

フォントサイズが小さい

文字が小さすぎて読めない資料。

どれだけ内容を詰め込んでも文字が読めなければ何も伝わらない。

無駄なアニメーションや挿絵が多い

発表内容と無関係なアニメーションや挿絵が散りばめられた資料。

アニメーションや挿絵は目立つので、資料の中にこれらがあるとどうしても目をとられる。

で、いつのまにか発表内容についていけなくなる。

こうならないために、発表内容と関係のないものは使わないor極力削るべき。

聴衆が誰であるかを意識していない

聴衆がどういう知識を持った、どういう立場の人であるかを意識出来ていない資料。

聴衆が聞きたいこと以外を延々と述べ、聴衆が聞きたいことをサクッと流すなど。

例えば、新入社員が工場での実習内容報告のプレゼンテーションを行う際に、工場の工程について延々と述べるなどはダメな例。工場の偉い人は自分の工場の工程については発表してもらわなくても知ってる。

聞きたいのはそんなことではなく、そこで何を感じ、何を学んだか、また実習生という立場からの工場に対しての新鮮な意見、提言などである。

聴衆に向かって話していない

ずっとスクリーンまたはPCを見つめたままで、聴衆の方を向かない発表。

聴衆の方を向かずにPCばかり見つめていては説得力に欠ける。

聴衆の方を向くのが苦手な人は、うなづきグセのある人を聴衆の中から見つけて、その人に訴えかけるように話すと気分的に楽。

原稿を読み上げているだけ

自分の言葉で話さずに、ひたすら原稿を読み上げるだけの発表。

原稿を読み上げられると、どうしても淡々と発表が進むため聴衆がついていけない。

外国語での発表ならいざ知らず、母国語の発表は自分の言葉で発表した方がよい。

話すスピードが早い

一つ前の原稿読み上げと重なる部分もあるが、緊張などの理由により、話すスピードが早く聞き取りにくい発表。

自分では遅いと思うぐらいがちょうどよかったりする。自分の発表を録画して見てみるとスピードをつかみやすい。

レーザーポインタの使いどころがおかしい

レーザーポインタが常にスクリーンに向けられており、ちょこまかと目障りな発表。

テキストだけのページ等では、無理にレーザーポインタを使う必要は無い。ポインタで指し示さなくても聴衆は読んでくれる。

レーザーポインタは、本当に必要なときだけ使うようにする。

「え〜」「あのー」が多い

無意識に「え〜」「あのー」を連発している発表。

クセで出てしまう場合もあるが、発表内容の論理展開がおかしい場合などに、自分でも何を言っていいか分からなくなって思わず口に出してしまうケースが多い。

論理展開がしっかりとしており、言いたい事が頭の中で整理されていれば、言葉は自然と出てくる。

「え〜」「あのー」を連発してしまうようであれば、発表資料についても再検討すべき。

時間オーバー

規定の時間を過ぎた発表。

司会や座長に迷惑がかかる。時間内に発表を終えることはプレゼンの最低限のマナー。



以上です。

ここに挙げた項目に注意するだけでも、プレゼンテーションはかなり分かりやすいものになるんじゃないでしょうか。

本記事の内容は、完全に個人的な意見なので、それはオカシイ!などありましたらご意見お待ちしております。

2009-02-06

[]PythonでElementTreeを使ってXMLを処理する方法

ElementTreeはpythonでXMLを扱うためのライブラリです。バージョン2.5からはpythonに標準で内蔵されています。

このライブラリを使うと、XMLをパースしてプログラム内で利用しやすい形に変換したり、XMLファイルを生成したりすることが出来ます。そこで今回は、XMLをパースして利用する方法についてまとめたいと思います。

準備

Python2.5以降にはElementTreeが標準で内蔵されているため、パッケージを個別で入手する必要はありません。

以下のようにインポートするだけで利用できます。

from xml.etree.ElementTree import *

Python2.5より古いバージョンを利用している場合は、

からパッケージを入手し、以下のようにインポートして下さい。

from elementtree.ElementTree import *

利用データ

今回の説明では、以下の内容のXMLファイルをサンプルとして扱います。

<window width="1920">
	<title font="large" color="red">sample</title>
	<buttonbox>
		<button>OK</button>
		<button>Cancel</button>
	</buttonbox>
</window>

Elementの作成

ElementTreeを使う上でメインとなるのがElementというオブジェクトです。まずは、このElementの作成方法について以下に例を示します。

# 文字列から作成
xmlString = '<window width="1920"><title font="large" color="red">sample</title><buttonbox><button>OK</button><button>Cancel</button></buttonbox></window>'
elem = fromstring(xmlString) # ルート要素を取得(Element型)

#ファイルから作成
tree = parse("sample.xml") # 返値はElementTree型
elem = tree.getroot() # ルート要素を取得(Element型)

XMLを表す文字列からElementを作成するには、fromstringメソッドを呼び出します。WebAPIなどから取得したデータをパースしたい場合はこの方法を利用することが多いと思います。

また、XMLファイルからデータを読み込む場合はparseというメソッドを利用します。parseの返値はElementTree型となります。このElementTree型はXMLファイルからデータを読み込んだり、書き込んだりする際に利用されるラッパークラスです。ここでは、とりあえず上記の様にparseメソッドを呼んで、その後にgetrootメソッドを呼べばElement型のルート要素が取得できると覚えておけば問題ありません。


データの参照

タグ名、属性(attribute)を参照する方法。

# 要素のタグを取得
print elem.tag
# attributeの取得
print elem.get("width")
# デフォルトを指定してattributeを取得
print elem.get("height", "1200")
# attribute名のリスト取得
print elem.keys()
# (attribute, value)形式タプルのリスト取得
print elem.items()

実行結果

window

1920

1200

['width']

[('width', '1920')]


要素の検索

条件にマッチする要素を検索する方法。

# 条件に一番最初にマッチした要素を返す
print elem.find(".//buttonbox").tag
# 条件にマッチする要素をリストで返す
for e in elem.findall(".//button"):
    print e.tag
# 条件にマッチする一番最初の要素のテキストを返す
print elem.findtext(".//button")
# findtextを分けて書くと以下の通り
print elem.find(".//button").text

実行結果

buttonbox


button

button


OK

OK

find,findall,findtextの引数にはXPath形式を利用することが出来ます。詳細については以下を参照して下さい。

http://effbot.org/zone/element-xpath.htm


要素への順次アクセス

XML内の要素を1つずつ参照する方法。

# すべての要素にアクセス
for e in elem.getiterator():
    print e.tag
# 条件指定(tag名を指定)
for e in elem.getiterator("button"):
    print e.tag
# 子要素のリストを取得(再帰的ではなく、直系の子要素のみ)
for e in list(elem):
    print e.tag

実行結果

window

title

buttonbox

button

button


button

button


title

buttonbox


子要素から親要素へのアクセス

子要素と親要素の関係を保持する方法。公式のマニュアルではジェネレーターを定義する方法と、対応関係を保持するマップを作成してしまう方法が紹介されています。

# ジェネレーターを使った方法
def iterparent(elem):
    for parent in elem.getiterator():
        for child in parent:
            yield parent, child

for p,c in iterparent(elem):
    print c.tag+":"+p.tag

# (child, parent)形式のマップを生成する方法
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
for k in parent_map.keys():
    print k.tag+":"+parent_map.get(k).tag

実行結果

title:window

buttonbox:window

button:buttonbox

button:buttonbox


title:window

buttonbox:window

button:buttonbox

button:buttonbox

以上です。

参考ページ