形態素解析を行い名詞の出現回数を調べる
Yahoo デベロッパーネットワーク を利用すると、形態素解析を行ってくれるWebサービスを利用することができる。
形態素解析が何かとか知りたいプログラマーさんは、
あたりの本がわかりやすいのではないでしょうか。
で、ちょっとアンケート結果みたいなものから単語を抽出したいなーと思い、まぁそんなに件数はないのですが、プログラマたるもの、めんどくさがりやで無ければならない と思い立ち、スクリプトを簡単に書きました。
ちょっと再利用できそうなので、メモもかねてブログに上げとこうかと。
あ、念のためですが、以下は Python のコードです。
# -*- coding: utf-8 -*-
import sys
import getopt
import codecs
import urllib
import urllib2
import xml.dom.minidom
APPID = r'yahoo デベロッパーネットワークでIDを取得してください'
REQUEST_URL = r'http://jlp.yahooapis.jp/MAService/V1/parse'
def main():
try:
opts, args = getopt.getopt(sys.argv[1:],"i:o:c:")
except getopt.GetoptError:
usage()
sys.exit(2)
content_file = None
output_file = None
code_set = None
print opts
for o, a in opts:
if o == '-i':
content_file = a
if o == '-o':
output_file = a
if o == '-c':
code_set = a
if content_file == None:
usage()
sys.exit(2)
else:
if output_file == None:
output_file = content_file + ".out"
if code_set == None:
code_set = 'utf-8'
analyze(content_file, output_file, code_set)
def usage():
print 'usage: questionnaire -i {content_file} -o {output_file} -c {code_set}'
def analyze(content_file, output_file, code_set):
sentence = make_sentence(content_file, code_set)
param_map = {}
param_map['sentence'] = sentence
param_map['results'] = r'uniq' #r'uniq'
param_map['filter'] = r'9'
request = make_request(param_map)
xml = urllib2.urlopen(request)
ret = parse(xml)
output_report(output_file, ret, code_set)
def output_report(output_file, ret, code_set):
out_cols_ja = {'count':u'出現数','surface':u'語句'}
ret.insert(0, out_cols_ja)
out = codecs.open(output_file, 'w', code_set)
for item in ret:
line = '%s,%s' % (item['surface'],item['count'])
print line
out.write(line)
def parse(xml_response):
result = []
dom = xml.dom.minidom.parse(xml_response)
root = dom.documentElement
words = root.getElementsByTagName('word')
for word in words:
result_item = {'count':0,'surface':''}
result.append(result_item)
for child in word.childNodes:
if child.nodeName == 'count': # 形態素の出現数
result_item[child.nodeName] = get_node_text(child)
elif child.nodeName == 'surface': # 形態素の表記
result_item[child.nodeName] = get_node_text(child)
return result
def get_node_text(node):
ret = ''
for child in node.childNodes:
if child.nodeType in (child.TEXT_NODE, child.CDATA_SECTION_NODE):
ret = ret + child.data
return ret
def make_request(param_map):
param_map['appid'] = APPID
return REQUEST_URL + '?' + urllib.urlencode(param_map)
def make_sentence(content_file, code_set):
f = codecs.open(content_file, 'r', code_set)
return ''.join([l.replace('\r',' ').replace('\n',' ') for l in f])
if __name__ == '__main__':
main()
こんな感じでパラメータを渡して上げると、テキスト中に含まれる名詞とその出現数を、CSV形式で出力します。
-i は テキストを含んだテキストファイル、-c はそのファイル&出力ファイルのエンコード、-o で出力ファイルを指定できます。
-i "c:\work\test.txt" -c "shift-jis"
