ノート
訪問者数 3329      最終更新 2015-04-24 (金) 09:14:02

目次

09/12/17 nltk内からコンパイル済みのJava(要するにStanford Parser) を呼出す。但し構造の中身を自由に取り出せない。

実際にStanford Parserを呼び出してみる。
まず、JavaのコードのファイルParserDemo.javaを作る。

import java.util.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
class ParserDemo {
  public static void main(String[] args) {
   LexicalizedParser lp = new LexicalizedParser("/usr/local/stanford-parser-2008-10-26/englishPCFG.ser.gz");
    lp.setOptionFlags(new String[]{"-maxLength", "80", "-retainTmpSubcategories"});
    String[] sent = { "This", "is", "an", "easy", "sentence", "." };
    Tree parse = (Tree) lp.apply(Arrays.asList(sent));
    parse.pennPrint();
    System.out.println();

    TreebankLanguagePack tlp = new PennTreebankLanguagePack();
    GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
    GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
    Collection tdl = gs.typedDependenciesCollapsed();
    System.out.println(tdl);
    System.out.println();

    TreePrint tp = new TreePrint("penn,typedDependenciesCollapsed");
    tp.printTree(parse);
  }
}

これを、あらかじめjavacでコンパイルしておく。ParserDemo.classが生成される。

このバイトコードファイルを、Python/NLTKから呼び出すことができる。

python
>>> import nltk
>>> nltk.internals.java(['ParserDemo'],'/home/yamanouc/src/stanford:/usr/local/stanford-parser/stanford-parser.jar')
Loading parser from serialized file /usr/local/stanford-parser-2008-10-26/englishPCFG.ser.gz ... done [3.0 sec].
(ROOT [35.686]
  (S [35.580]
    (NP [6.140] (DT [2.301] This))
    (VP [28.298] (VBZ [0.144] is)
      (NP [22.961] (DT [3.221] an) (JJ [8.072] easy) (NN [8.897] sentence)))
    (. [0.002] .)))

[nsubj(sentence-5, This-1), cop(sentence-5, is-2), det(sentence-5, an-3), amod(sentence-5, easy-4)]

(ROOT
  (S
    (NP (DT This))
    (VP (VBZ is)
      (NP (DT an) (JJ easy) (NN sentence)))
    (. .)))

nsubj(sentence-5, This-1)
cop(sentence-5, is-2)
det(sentence-5, an-3)
amod(sentence-5, easy-4) 

(None, None)
>>>

但し、この使い方は、Javaのプログラムをバッチ的に使うだけしかできず、StdinとStdoutでデータの受け渡しをすることができるだけである。だから、できたトリーは、文字列形式で出力すると、それをもう一度Python内でトリー構造に作り直す方が使い易くなるだろう。(この部分はこれから検討)

09/03/06 JythonからJava (要するにStanford Parser) を使う。但しJythonはNLTKと共存できない

では、Jython(http://www.jython.org)をインストールする。OreganoではFecore Coreなのでyumでインストールできる。
Jythonをインストールするためには、Javaが必要。JavaはJavaのサイトから最新のもの(1.6.0_12)をインストール。

JythonでPythonからJavaプログラムを呼び出す手順は(Jython User GuideAccessing Java from Jythonによる)

C:\jython>jython
Jython 2.0 on java1.2.1
Type "copyright", "credits" or "license" for more information.
>>> from java.util import Random
>>> r = Random()
>>> r.nextInt()
-790940041
>>> for i in range(5):
...     print r.nextDouble()
...
0.23347681506123852
0.8526595592189546
0.3647833839988137
0.3384865260567278
0.5514469740469587

Jython 2.0 on java1.2.1
Type "copyright", "credits" or "license" for more information.
>>> from java.util import *
>>> Random
<jclass java.util.Random at 31702169>
>>> Hashtable
<jclass java.util.Hashtable at 7538094>

など。

では、Stanford Parser (/usr/local/stanford-parser/*) を呼び出すことを考える。
まずベースとしてJava版のアクセスプログラム(パッケージ中/ParserDemo.java)を見てみよう。

import java.util.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;

class ParserDemo {
  public static void main(String[] args) {
    LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz");
    lp.setOptionFlags(new String[]{"-maxLength", "80", "-retainTmpSubcategories"});

    String[] sent = { "This", "is", "an", "easy", "sentence", "." };
    Tree parse = (Tree) lp.apply(Arrays.asList(sent));
    parse.pennPrint();
    System.out.println();

    TreebankLanguagePack tlp = new PennTreebankLanguagePack();
    GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
    GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
    Collection tdl = gs.typedDependenciesCollapsed();
    System.out.println(tdl);
    System.out.println();

    TreePrint tp = new TreePrint("penn,typedDependenciesCollapsed");
    tp.printTree(parse);
  }
}

これは、Javaとしてコンパイル(javac ParserDemo.java)⇒実行(java ParserDemo)できることを確認する。

$ java ParserDemo
Loading parser from serialized file englishPCFG.ser.gz ... done [3.1 sec].
(ROOT [35.686]
  (S [35.580]
    (NP [6.140] (DT [2.301] This))
    (VP [28.298] (VBZ [0.144] is)
      (NP [22.961] (DT [3.221] an) (JJ [8.072] easy) (NN [8.897] sentence)))
    (. [0.002] .)))

[nsubj(sentence-5, This-1), cop(sentence-5, is-2), det(sentence-5, an-3), amod(sentence-5, easy-4)]

(ROOT
  (S
    (NP (DT This))
    (VP (VBZ is)
      (NP (DT an) (JJ easy) (NN sentence)))
    (. .)))

nsubj(sentence-5, This-1)
cop(sentence-5, is-2)
det(sentence-5, an-3)
amod(sentence-5, easy-4)

では、これをPythonから呼び出すように書き換える(ParserDemo.py)。

#!/usr/bin/env python
# encoding: utf-8
# -*- coding: utf-8 -*-
# coding: utf-8
##

import sys
import codecs
import os
sys.path.append('/usr/local/stanford-parser/stanford-parser.jar')
#import java.util.*
from java.util import *
#import edu.stanford.nlp.trees.*
from edu.stanford.nlp.trees import *
#import edu.stanford.nlp.parser.lexparser.LexicalizedParser
from edu.stanford.nlp.parser.lexparser import LexicalizedParser

### A magic for printing UTF-8 characters
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

#LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz")
lp = LexicalizedParser("/usr/local/stanford-parser/englishPCFG.ser.gz")
#optionstring = {"-maxLength ",  "80", "-retainTmpSubcategories"}
optionstring = ["-maxLength",  "80", "-retainTmpSubcategories"]

lp.setOptionFlags(optionstring)

##sent = [ "This", "is", "an", "easy", "sentence", "." ]  #<< This works(1).
#sent = ( "This", "is", "an", "easy", "sentence", "." )   #This is also acceptable
#send_newversion = "This is an easy sentence."
#Tree parse = (Tree) lp.apply(Arrays.asList(sent))
#parse = lp.apply(Arrays.asList(sent))  #<< This works(1)
parse = lp.apply(sent) 
parse.pennPrint()
print "-" * 80
#TreebankLanguagePack tlp = new PennTreebankLanguagePack();
tlp = PennTreebankLanguagePack();
#GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
gsf = tlp.grammaticalStructureFactory();
#GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
gs = gsf.newGrammaticalStructure(parse);
#Collection tdl = gs.typedDependenciesCollapsed();
tdl = gs.typedDependenciesCollapsed();
print(tdl);
print "-" * 80

#TreePrint tp = new TreePrint("penn,typedDependenciesCollapsed");
tp = TreePrint("penn,typedDependenciesCollapsed");
tp.printTree(parse);

主な点は、

このプログラムをjythonで起動実行する。

$jython ParserDemo.py
Loading parser from serialized file /usr/local/stanford-parser/englishPCFG.ser.gz ... done [2.9 sec].
(ROOT [35.686]
  (S [35.580]
    (NP [6.140] (DT [2.301] This))
    (VP [28.298] (VBZ [0.144] is)
      (NP [22.961] (DT [3.221] an) (JJ [8.072] easy) (NN [8.897] sentence)))
    (. [0.002] .)))
--------------------------------------------------------------------------------
[nsubj(sentence-5, This-1), cop(sentence-5, is-2), det(sentence-5, an-3), amod(sentence-5, easy-4)]
--------------------------------------------------------------------------------
(ROOT
  (S
    (NP (DT This))
    (VP (VBZ is)
      (NP (DT an) (JJ easy) (NN sentence)))
    (. .)))

nsubj(sentence-5, This-1)
cop(sentence-5, is-2)
det(sentence-5, an-3)
amod(sentence-5, easy-4)

となった。

もう1つの方法 javabridge を試す (2015-04-24, mint)

参照:

インストール

pip install javabridge

多少エラー警告が出たが終了。

使ってみる。ホームのドキュメントページ にある例。

import os
import javabridge

javabridge.start_vm(run_headless=True)
try:
    print javabridge.run_script('java.lang.String.format("Hello, %s!", greetee);',
                                dict(greetee='world'))
finally:
    javabridge.kill_vm()

実行できた。

同ページにある他のサンプルのために、wxPythonをインストール。

yum install wxPython-devel

いくつか依存ファイルもインストールされた。

インストール:
  wxPython-devel.x86_64 0:2.8.12.0-1.el6

依存性関連をインストールしました:
  bakefile.x86_64 0:0.2.8-3.el6.centos
  python-empy.noarch 0:3.3-5.el6.centos
  wxBase.x86_64 0:2.8.12-1.el6.centos
  wxGTK.x86_64 0:2.8.12-1.el6.centos
  wxGTK-devel.x86_64 0:2.8.12-1.el6.centos
  wxGTK-gl.x86_64 0:2.8.12-1.el6.centos
  wxGTK-media.x86_64 0:2.8.12-1.el6.centos
  wxPython.x86_64 0:2.8.12.0-1.el6

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-04-24 (金) 09:14:02 (794d)