INFORMATION
テクノロジ
Solr 3.2からNExTR on Railsを使う
さて、先日リリースされましたSolr 3.2からNExTR on Rails(以下NEXTRRと記す)を使う方法を説明します。NEXTRRは、日本語文書から固有表現を抽出するツールでWeb API形式で使えるようになっているものです。NEXTRRをまだ導入していない人は、この記事を参考にしながら導入して下さい。なお、サブスクリプション・パッケージをお使いのお客様は、0.7以降をお使いいただければ同じことができます。サブスクリプション・パッケージのREADME.txtにはNEXTRRを使う方法が書かれていますので、ここではSolr 3.2のディレクトリ構造に沿って説明していきます。
- 最初にSolr 3.2をダウンロードします。apache-solr-3.2.0.tgzファイルをダウンロードしたら適当なディレクトリに展開します。ここでは説明の便宜上、/home/solrディレクトリにダウンロードして展開することとします。
$ cd /home/solr # ここにダウンロードして... # ダウンロードしたファイルを展開 $ tar xvzf apache-solr-3.2.0.tgz
- 次に、日本語文書を扱うので、日本語形態素解析器lucene-gosenをインストールします。インストールは、Solrホームディレクトリの下にlibというディレクトリを作成し、そこにjarファイルをおくだけです。
$ cd /home/solr/apache-solr-3.2.0/example/solr $ mkdir lib $ cd lib $ wget http://lucene-gosen.googlecode.com/files/lucene-gosen-1.0.1-ipadic.jar
- 次に上記と同じlibディレクトリにrondhuit-uimaをインストールします。rondhuit-uimaは、SolrからYahoo!のキーワード抽出Web APIを利用したり、NEXTRRを利用する橋渡しの役目をするライブラリです。
$ cd /home/solr/apache-solr-3.2.0/example/solr/lib $ wget http://rondhuit-uima.googlecode.com/files/rondhuit-uima-1.1.1.jar
- 次に、schema.xmlに日本語形態素解析器を使ったフィールド型と、そのフィールド型を使って日本語のニュース記事を保存するフィールドを定義します。ここではフィールド型をtext_jaとし、記事を保存するフィールド名をarticleとします。
$ cd /home/solr/apache-solr-3.2.0/example/solr/conf $ vi schema.xml
schema.xmlファイルには次のフィールド型text_jaとそのフィールド型を使ったフィールドarticleを定義します。: <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.JapaneseTokenizerFactory"/> </analyzer> </fieldType> : <field name="article" type="text_ja" indexed="true" stored="true" multiValued="true"/> :
さらに、*_smというstring型でmultiValuedなダイナミックフィールドを定義します。<dynamicField name="*_sm" type="string" indexed="true" stored="true" multiValued="true"/>
- 次に、solrconfig.xmlにUIMAのライブラリの設定を行います。
$ cd /home/solr/apache-solr-3.2.0/example/solr/conf $ vi solrconfig.xml
solrconfig.xmlに、次の設定を追加します。<lib dir="../../contrib/uima/lib" /> <lib dir="../../dist/" regex="apache-solr-uima-\d.*\.jar" />
- 次に、同じくsolrconfig.xmlファイルに、rondhuit-uimaを使うための設定を行います。runtimeParametersのhostとportには、NEXTRRのIPアドレスとポート番号(通常は3000)を各自の環境に合わせて設定します。
<updateRequestProcessorChain name="uima"> <processor class="org.apache.solr.uima.processor.UIMAUpdateRequestProcessorFactory"> <lst name="uimaConfig"> <lst name="runtimeParameters"> <str name="host">192.168.213.137</str> <str name="port">3000</str> </lst> <str name="analysisEngine">/com/rondhuit/uima/desc/NextAnnotatorDescriptor.xml</str> <bool name="ignoreErrors">true</bool> <str name="logField">id</str> <lst name="analyzeFields"> <bool name="merge">false</bool> <arr name="fields"> <str>article</str> </arr> </lst> <lst name="fieldMappings"> <lst name="type"> <str name="name">org.apache.uima.SentenceAnnotation</str> <lst name="mapping"> <str name="feature">coveredText</str> <str name="field">sentence</str> </lst> </lst> <lst name="type"> <str name="name">com.rondhuit.uima.next.NamedEntity</str> <lst name="mapping"> <str name="feature">entity</str> <str name="fieldNameFeature">name</str> <str name="dynamicField">*_sm</str> </lst> </lst> </lst> </lst> </processor> <processor class="solr.LogUpdateProcessorFactory" /> <processor class="solr.RunUpdateProcessorFactory" /> </updateRequestProcessorChain> <requestHandler name="/update/uima" class="solr.XmlUpdateRequestHandler"> <lst name="defaults"> <str name="update.chain">uima</str> </lst> </requestHandler>
- 次に、固有表現抽出を試すための適当なニュース記事を用意します。ここではこの記事の文章を使いました。
$ cd cd /home/solr/apache-solr-3.2.0/example/exampledocs $ vi news.xml
news.xmlには次のようにニュース記事を貼り付けます。<add> <doc> <field name="id">http://sankei.jp.msn.com/politics/news/110606/stt11060600110000-n1.htm</field> <field name="article"> <!-- ここにニュース記事文章を貼り付ける --> </field> </doc> </add>
- 次に、上記と同じディレクトリにあるpost.shを編集してUIMAを使うように変更します。
$ cd /home/solr/apache-solr-3.2.0/example/exampledocs $ vi post.sh
変更する部分は、次の(1)と(2)の2カ所です。FILES=$* URL=http://localhost:8983/solr/update # (1) 上の行をコピーして、変数UIMA_URLを設定 UIMA_URL=http://localhost:8983/solr/update/uima for f in $FILES; do # (2) 以下2行の$URLを$UIMA_URLに変更 echo Posting file $f to $UIMA_URL curl $UIMA_URL --data-binary @$f -H 'Content-type:application/xml' echo done #send the commit command to make sure all the changes are flushed and visible curl $URL --data-binary '<commit/>' -H 'Content-type:application/xml' echo
- Solrを起動します。
$ cd /home/solr/apache-solr-3.2.0/example $ java -jar start.jar
- 別のコンソールを使って、ニュース記事news.xmlを登録します。
$ cd /home/solr/apache-solr-3.2.0/example/exampledocs $ ./post.sh news.xml
- 次のURLにブラウザからアクセスし、ニュース記事とともに固有表現が抽出できていることを確認します。
http://localhost:8983/solr/select/?q=*%3A*
一部適切でないところもありますが(PERSON_smとして「党」が抽出されている)、固有名詞が抽出できているのがわかります。<doc> <arr name="DATE_sm"> <str>5日</str> </arr> <arr name="GPE_sm"> <str>東日本</str> </arr> <arr name="NATURAL_DISASTER_sm"> <str>東日本大震災</str> </arr> <arr name="ORGANIZATION_sm"> <str>民主党</str> <str>フジテレビ</str> <str>NHK</str> <str>自民党</str> </arr> <arr name="PERSON_sm"> <str>党</str> <str>岡田克也</str> <str>石原伸晃</str> <str>菅直人</str> </arr> <arr name="PLAN_sm"> <str>連立構想</str> </arr> : </doc>
関連リンク
INFORMATION
KandaSearch
KandaSearch はクラウド型企業向け検索エンジンサービスです。
オープンAPIでカスタマイズが自由にできます。
セミナー
企業が検索エンジンを選定する際のポイントから、
実際の導入デモをお客様ご自身でご体験!