JP2012063868A - 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム - Google Patents
言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム Download PDFInfo
- Publication number
- JP2012063868A JP2012063868A JP2010205942A JP2010205942A JP2012063868A JP 2012063868 A JP2012063868 A JP 2012063868A JP 2010205942 A JP2010205942 A JP 2010205942A JP 2010205942 A JP2010205942 A JP 2010205942A JP 2012063868 A JP2012063868 A JP 2012063868A
- Authority
- JP
- Japan
- Prior art keywords
- parser
- character string
- grammar
- description
- grammar description
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
- G06F40/211—Syntactic parsing, e.g. based on context-free grammar [CFG] or unification grammars
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Machine Translation (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】形式言語処理パーサーにFP以外の文字列処理関数、例えば、自然言語処理パーサーを組み合わせたパーサーを自動的に生成する手法を提供する。
【解決手段】文法記述は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列(str)の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つのstrの直前の入力文字列までをパーズし、P2を使用して、当該第2のパーサーで最初に受理可能な少なくとも1つのstrをパーズする文法記述P1 U P2; P2に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つstrの先頭文字列を含む少なくとも1つのstrをパーズし、P1に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つのstrをパーズする文法記述P1 F P2である。
【選択図】図3
【解決手段】文法記述は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列(str)の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つのstrの直前の入力文字列までをパーズし、P2を使用して、当該第2のパーサーで最初に受理可能な少なくとも1つのstrをパーズする文法記述P1 U P2; P2に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つstrの先頭文字列を含む少なくとも1つのstrをパーズし、P1に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つのstrをパーズする文法記述P1 F P2である。
【選択図】図3
Description
本発明は、少なくとも2つの言語処理パーサーを組み合わせて、組み合わせパーサー(ハイブリッド・パーサーともいう)を生成する方法、並びにそのコンピュータ及びコンピュータ・プログラムに関する。また、本発明は、上記組み合わせパーサーを使用する方法、並びにそのコンピュータ及びコンピュータ・プログラムに関する。
言語処理において、言語における文法上の構造を解析するために構文解析器(パーサー)が使用される。パーサーには、主に、自然言語処理パーサー(以下、npパーサー(an NLP parser)ともいう)と形式言語処理パーサー(以下、fpパーサー(a parser for formal grammar)ともいう)とがある。自然言語処理パーサーは、自然文を解釈するパーサーである。自然文は自然言語テキストとも呼ばれ、自然言語テキストは人間によって日常の意思疎通のために用いられる、文化的背景を持って自然に発展してきた記号体系である。一方、形式言語処理パーサーは、形式文を含む文を解釈するのに適したパーサーである。形式文は自然文又は自然言語テキストに対比される語であり、形式文は、プロジェクト成果物文書、ソフトウェアの仕様書、数式又はプログラミング言語を含む文書など人工的に定義されたもののである。プロジェクト成果物文書は、例えば、要求仕様書、設計書、技術書を含む。
言語処理パーサー同士を組み合わせて、組み合わせパーサーを宣言的記述データ(以下単に、宣言的記述ともいう)から自動的に生成する技術が知られている。当該技術は例えば、パーサー・ジェネレータ(パーサー生成器)及びパーサー・コンビネーター・ライブラリである。パーサー・ジェネレータは例えば、Yacc(Yet Another Compiler-Compiler)、ANTLR(ANother Tool for Language Recognition)、CUPS、及びJava(登録商標)CC(Java(登録商標) Compiler Compiler)である。パーサー・コンビネーター・ライブラリは例えば、Parsec(parallax of one arcsecond)、JParsec、及びScala標準ライブラリーである。最近では、Yaccなどのツールの普及により、文法を記述するだけで、パーサーを自動的に生成すること、すなわちパーサーのプログラムのソースコードを出力することが可能である。
また、宣言的に記述できないパターンの組み合わせ、例えば形式言語処理パーサーと他の処理(例えば自然言語処理)との組み合わせをその都度個別にプログラミングして対応するアプローチが知られている。この理由は、自然言語処理パーサーが、形式言語処理パーサーと異なる性質を持っているために、従来の方法では自然言語処理パーサーと形式言語処理パーサーとを組み合わせることが出来ないからである。
下記特許文献1は、入力された日本語文を形態素解析し、形態素解析の結果の一部分に適用できる構文規則が、ただ1つかどうかの判断を行い、当該判断による出力を用いて形態素解析結果に構文規則を適用し、当該適用後の形態素列を構文解析する旨を記載する(問題点を解決するための手段)。
形式言語処理パーサー同士を組み合わせた組み合わせパーサー、及び形式言語処理パーサーと他の処理である自然言語処理パーサーとを組み合わせた組み合わせパーサーでは、組み合わせるパーサーが受理言語を持つことを前提にしている。従って、各種の自然言語処理パーサーの適用の仕方の多くが、既存の文法、例えばPEG(Parsing Expression Grammar)のみで記述できない。図1a及びbは、その一例を示す。
図1aは、形式言語処理パーサー同士を組み合わせて、組み合わせパーサーを宣言的記述から自動的に生成する例である。図1aのパーサーの組み合わせパターン(FP1;FP2)は、形式言語処理パーサーFP1及びFP2同士の組み合わせである。
図1aの例では、入力文字列はsであり、具体的には、s = s1s2s’である。図1aの組み合わせパーサーの処理は次の通りである:(1)FP1;FP2は、入力文字列sを受け取る:(2)FP1;FP2はそれぞれs1及びs2を受理し、残りの文字列s’を返す。
図1aの組み合わせパターンでは、形式言語処理パーサー同士を組み合わせて、組み合わせパーサーを宣言的記述から自動的に生成するために、少ないコストですむ。しかしながら、図1aの組み合わせパターンでは、FP1;FP2がそれぞれs1及びs2を受理しているとおり、組み合わせるパーサーが受理言語を持つことが前提である。従って、図1aの組み合わせパターンでは、既存の文法記述で自然言語処理を宣言することができない。
図1aの例では、入力文字列はsであり、具体的には、s = s1s2s’である。図1aの組み合わせパーサーの処理は次の通りである:(1)FP1;FP2は、入力文字列sを受け取る:(2)FP1;FP2はそれぞれs1及びs2を受理し、残りの文字列s’を返す。
図1aの組み合わせパターンでは、形式言語処理パーサー同士を組み合わせて、組み合わせパーサーを宣言的記述から自動的に生成するために、少ないコストですむ。しかしながら、図1aの組み合わせパターンでは、FP1;FP2がそれぞれs1及びs2を受理しているとおり、組み合わせるパーサーが受理言語を持つことが前提である。従って、図1aの組み合わせパターンでは、既存の文法記述で自然言語処理を宣言することができない。
図1bは、形式言語処理パーサーと他の処理である自然言語処理パーサーとを組み合わせて、組み合わせパーサーを宣言的記述から自動的に生成する例である。図1bのパーサーの組み合わせパターン(FP3;NP;FP5)は、形式言語処理パーサーFP3、自然言語処理パーサーNP及び形式言語処理パーサーFP5の組み合わせである。
図1bの例では、入力文字列はsであり、具体的にはs = s3s4s5である。図1bの組み合わせパーサーの処理は次の通りである:(1)FP3;NPは、入力文字列sを受け取る:(2)FP3がs3を受理し、NPが残りの全ての文字列(s4及びs5)を受理する。
図1bの組み合わせパーサーにおいて、NPが受理言語を持たないためにs4及びs5をまとめて受理する。従って、FP5はs5を受理できないので、FP5はs5に適用されない。さらに、既存の文法記述では、FP5をs5に適用する組み合わせパターンを記述することは出来ない。
図1bの例では、入力文字列はsであり、具体的にはs = s3s4s5である。図1bの組み合わせパーサーの処理は次の通りである:(1)FP3;NPは、入力文字列sを受け取る:(2)FP3がs3を受理し、NPが残りの全ての文字列(s4及びs5)を受理する。
図1bの組み合わせパーサーにおいて、NPが受理言語を持たないためにs4及びs5をまとめて受理する。従って、FP5はs5を受理できないので、FP5はs5に適用されない。さらに、既存の文法記述では、FP5をs5に適用する組み合わせパターンを記述することは出来ない。
また、宣言的に記述できないパターンの組み合わせをその都度個別にプログラミングする方法では、プログラムは概して複雑である。そのために、そのプログラムを再利用したり又は変更したりする対処が困難である。従って、当該プログラムの保守にコストがかかり、また当該プログラムは汎用性がない。
また、例えばプロジェクト成果物文書は、形式的な部分(例えば、独自記法及びテンプレート)と自然文が混在した記法であるという特徴を有する。そのために、プロジェクト成果物文書から情報を抽出するに際して、形式言語処理パーサー(fp)だけでは必要な情報が抽出できない。また、例えばプロジェクト成果物文書の種類及び形式はプロジェクトに依存し、またその種類又は形式の変更が多いという特徴を有する。そのために、各プロジェクト成果物文書に対応し組み合わせパーサーの生成にはコストを要する。また、各プロジェクト成果物文書に対応して組み合わせパーサーを生成するために、組み合わせパーサーに汎用性がない。
従って、個別にプログラミングするのではなく、ライブラリーに既にある形式言語処理パーサー(fp)に、文字列処理関数(N)、例えば自然言語処理パーサー(NP)をそのまま適用できるように自動的に組み合わせパーサーを生成する手法が、コスト及び汎用性の観点からも望まれている。
本発明は、少なくとも2の言語処理パーサーを組み合わせて、組み合わせパーサーを自動的に生成する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
本発明は、組み合わせパーサーを自動的に生成するに際して、下記に特定された文法記述の少なくとも1つに関連付けられた各パーサーを組み合わせる:
(1)文法記述P1 U P2は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、当該第2のパーサーを使用して、当該第2のパーサーで最初に受理可能な少なくとも1つの入力文字列をパーズする:
(2)文法記述P1 F P2は、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズする。
本発明は、組み合わせパーサーを自動的に生成するに際して、下記に特定された文法記述の少なくとも1つに関連付けられた各パーサーを組み合わせる:
(1)文法記述P1 U P2は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、当該第2のパーサーを使用して、当該第2のパーサーで最初に受理可能な少なくとも1つの入力文字列をパーズする:
(2)文法記述P1 F P2は、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズする。
また、本発明の1つの実施態様において、本発明は、形式言語処理パーサー(fp)にfp以外の文字列処理関数(N)、例えば各種の自然言語処理関数(NP)を組み合わせて、組み合わせパーサーを自動的に生成する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
また、本発明の1つの実施態様において、本発明は、複数の文法記述を含む宣言的記述から、形式言語処理パーサー(fp)と文字列処理関数(N)とを組み合わせて、組み合わせパーサーを自動的に生成する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
また、本発明の1つの実施態様において、本発明は、既存の文法記述、例えばPEGで解析できない入力文字列の部分を解析できるように、当該既存の文法記述を拡張する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
また、本発明の1つの実施態様において、本発明は、拡張された文法記述に関連付けられたパーサーを含む組み合わせパーサーを使用して、情報が抽出されるべきデータから情報を抽出する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
また、本発明の1つの実施態様において、本発明は、拡張された文法記述に関連付けられたパーサーを含む組み合わせパーサーを使用して、データが固有の記法に従って記述されているかどうかを検査する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
本発明の実施態様に従う文法記述P1 U P2及び/又は文法記述P1 F P2を既存の文法に追加することによって、既存の文法では解析出来ない部分を明示的に扱うことが可能であるパーサーを自動的に生成することが可能になる。また、本発明の実施態様に従う文法記述P1 U P2及び/又は文法記述P1 F P2は、パーサーにより受理可能な言語を増加させる。
また、本発明の実施態様に従う組み合わせパーサーは、組み合わせ元のパーサー自体をカスタマイズすることなく、入力文字列の指定部分に適用することが可能になる。
また、本発明の実施態様に従う組み合わせパーサーは、組み合わせ元のパーサー自体をカスタマイズすることなく、入力文字列の指定部分に適用することが可能になる。
以下に、本発明の代表的な実施態様を説明するとともに、当該実施態様が後に述べる各図面とどのように対応するかについて括弧書きで説明する。次に、各図面に従って本発明の実施形態をさらに説明する。なお、本発明の実施形態は、本発明の好適な形態を説明するためのものであり、本発明の範囲をここで示すものに限定する意図はないことを理解されたい。
本発明は、少なくとも2の言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラムを提供する。
本発明の方法の実施態様では、下記に特定された文法記述P1 U P2及びP1 F P2の少なくとも1つに関連付けられた各パーサーを組み合わせて、組み合わせパーサーをメモリ内に生成するステップを含む。
本発明のコンピュータの実施態様では、プロセッサと、当該プロセッサに接続されたメモリと、下記に特定された各文法記述の少なくとも1つに関連付けられた各パーサーを組み合わせて、組み合わせパーサーを前記メモリ内に生成するパーサー生成部とを含む。
文法記述は、下記の通りである:
文法記述P1 U P2(図6)は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、第2のパーサーを使用して、当該第2のパーサーで最初に受理可能な少なくとも1つの入力文字列をパーズすることを意味する。
文法記述P1 F P2(図6)は、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズすることを意味する。
文法記述P1 U P2(図6)は、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、第2のパーサーを使用して、当該第2のパーサーで最初に受理可能な少なくとも1つの入力文字列をパーズすることを意味する。
文法記述P1 F P2(図6)は、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズすることを意味する。
本発明の実施態様では、組み合わせパーサーを生成する方法は、宣言的記述を使用することなしに、汎用のプログラム言語、例えばC言語、C++言語及びJava(登録商標)言語を用いて上記文法記述に対応する動作を行うプログラミングを行い、そして各パーサーを組み合わせて、組み合わせパーサーを生成するステップを実行することによっても実現可能である。
本発明の他の実施態様では、組み合わせパーサーを生成する上記方法は、複数の文法記述を含む宣言的記述をメモリ内に受け取るステップと、当該受け取った宣言的記述をパーズして、当該宣言的記述中に示される各文法記述の組み合わせを特定するステップとをさらに含む。ここで、当該宣言的記述中に示される文法記述は、前記文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有している。
本発明の他の実施態様では、組み合わせパーサーを生成する方法は、複数の文法記述を含む宣言的記述を受け取るステップと、当該受け取った宣言的記述をパーズして、当該宣言的記述中に示される各文法記述の組み合わせを特定するステップと、前記特定された各文法記述に関連付けられた各パーサーを組み合わせて、組み合わせパーサーを生成するステップとを含む。当該宣言的記述中に示される文法記述は、前記文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有している。
本発明の実施態様では、宣言的記述は複数の文法記述を含む。本発明の実施態様では、宣言的記述中の複数の文法記述の夫々に関連付けられた各パーサーを組み合わせて、組み合わせパーサーを生成する。宣言的記述は、例えば、一連のルールを用いて記述された文法記述を組み合わせて記述された文法記述の組み合わせパターンを含みうる。宣言的記述は、所定の文法に従い、ユーザによって記述されるか、あるいはコンピュータによって自動的に生成されてもよい。文法は、例えばPEGに従う文法記述を含みうる(図5及び図6を参照)。本発明の実施態様では、当該文法記述は、本発明の実施態様に従い下記から選ばれる少なくとも1つを有していることを特徴とする(図6の新たに追加された文法記述)。
本発明の実施態様では、文法は、文法記述P1 U P2及び/又は文法記述P1 F P2に加えて、既存の文法記述、例えばPEG(図5)を含んでもよい。
本発明の実施態様において、本発明は、宣言的記述に含まれる文法記述が、(1)受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理パーサー名である文法記述(以下、当該文法記述をNという)と、
(2)文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有していてもよい。
(2)文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有していてもよい。
本発明の実施態様では、文法記述P1 U P2において、P1又はP2の一方の文法記述が、文法記述Nでありうる(図13の1304「[is-a-NLP]」を参照)。同様に、本発明の実施態様では、文法記述P1 F P2において、P1又はP2の一方の文法記述が、文法記述Nでありうる。文法記述Nは、受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理関数である。文字列処理関数は自然言語処理名であってよい。また、当該文字列処理関数に対応するパーサーは、自然言語処理登録ストアに登録されうる。本発明の実施態様において、自然言語処理関数は、自然言語処理パーサーともみなすことが可能である。
さらに、本発明の実施態様では、文法記述P1 U P2において、P1又はP2の少なくとも他方の文法記述が、形式言語処理パーサーの指定でありうる。同様に、本発明の実施態様では、文法記述P1 F P2において、P1又はP2の少なくとも他方の文法記述が、形式言語処理パーサーの指定でありうる。
本発明の実施態様では、文法記述P1 F P2において、第2の文法記述(P2)で受理可能であり且つ上記入力文字列の先頭文字列を含む少なくとも1つの入力文字列が、当該先頭文字列から最長の文字列でありうる。最長の文字列とは、文法記述P1に対応するパーサーp1の強度である。パーサーp1は、先頭文字列から受理可能な複数の文字列がある場合に、最長の文字列を受理する。最長の文字列を受理するとは、例えばパーサーp1がパーサーa*である場合に、パーサーa*は、文字列a、aa、aaaのいずれをも受理する。しかし、パーサーa*が、文字列aaabをパーズすると必ずaaaが受理されて、残りの文字列としてbがパーズ結果として返されることである。これは、パーズ結果が必ず一意になるようにするためである。
本発明の実施態様では、特定するステップが、上記宣言的記述中の文法記述のトップレベルでの組み合わせを特定することを含んでもよい。また、本発明の実施態様では、特定するステップが、上記トップレベルでの組み合わせを特定した後に、当該特定された組み合わせの少なくとも一方をパーズして、当該一方中に示される各文法記述の組み合わせをさらに特定するステップをさらに含んでもよい。
本発明の実施態様では、形式言語処理パーサー(fp)は、受理言語を持つパーサーである。形式言語処理パーサー(fp)は入力文字列に対して、受理又は不受理を行うために、受理言語が事前に定まっている必要がある。形式言語処理パーサー(fp)は、入力文字列を受け取り、パーズ結果として例えば抽象構文木を返す関数又は、抽象構文木とパーズし切れなかった残りの文字列を返す関数として定式化されるものである。
FP以外の文字列処理である自然言語処理(N)は、文法記述Nに関連付けられている。自然言語処理(N)は、受理言語を持たずに、全ての入力文字を受理する文字列処理関数である。自然言語処理(N)は、ブラックボックス化された各種の自然言語処理関数を表す。自然言語処理(N)の特徴は、形式言語処理パーサー(fp)と異なり受理言語を持っていないこと、及び形式的に定められる受理言語を持たなくて良いために、入力文字列に対して、自然言語的な知見に基づいた統計処理、辞書引き処理などを自然言語処理関数の内部で自由に行うことが可能である。そのために、各種の実用的な自然言語処理をNで表すことが可能になる。自然言語処理(N)として例えば、各種の自然言語処理関数(NP)を指定出来る。自然言語処理(N)は、入力文字列を受け取り、パーズ結果として例えば抽象構文木を返す関数として定式化されるものである。
FP以外の文字列処理である自然言語処理(N)は、文法記述Nに関連付けられている。自然言語処理(N)は、受理言語を持たずに、全ての入力文字を受理する文字列処理関数である。自然言語処理(N)は、ブラックボックス化された各種の自然言語処理関数を表す。自然言語処理(N)の特徴は、形式言語処理パーサー(fp)と異なり受理言語を持っていないこと、及び形式的に定められる受理言語を持たなくて良いために、入力文字列に対して、自然言語的な知見に基づいた統計処理、辞書引き処理などを自然言語処理関数の内部で自由に行うことが可能である。そのために、各種の実用的な自然言語処理をNで表すことが可能になる。自然言語処理(N)として例えば、各種の自然言語処理関数(NP)を指定出来る。自然言語処理(N)は、入力文字列を受け取り、パーズ結果として例えば抽象構文木を返す関数として定式化されるものである。
本発明の実施態様では、自然言語処理(N)は例えばis-a-NLPとして記述され、is-a-NLPは、入力文字列全体を文とみなして、is-a関係にあるペアを取り出し、構文木抽出として返す自然言語処理関数である(図13の1304を参照)。
また、本発明は、組み合わせパーサーを使用する方法を提供する。
(1)当該方法の1つの実施態様は、情報が抽出されるべきデータをメモリ内に受け取るステップと、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能な部分文字列を上記データ中から見つけるステップと、上記データの先頭文字列から上記見つけられた部分文字列の先頭直前までの部分文字列を第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、上記見つけられた部分文字列を上記第2のパーサーでパーズするステップと、上記第1のパーサーでパーズして得られる第1の解析結果と、上記第2のパーサーでパーズして得られる第2の解析結果とから構文木を上記メモリ内に作成するステップとを含む。
(2)当該方法の他の実施態様は、検査されるべきデータをメモリ内に受け取るステップと、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能であり且つ上記データの先頭文字列を含む少なくとも1つの部分文字列を上記データ中から見つけるステップと、上記見つけられた部分文字列を第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、当該第1のパーサーでパーズして得られる第1の解析結果から構文木を上記メモリ内に作成するステップとを含む。
(1)当該方法の1つの実施態様は、情報が抽出されるべきデータをメモリ内に受け取るステップと、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能な部分文字列を上記データ中から見つけるステップと、上記データの先頭文字列から上記見つけられた部分文字列の先頭直前までの部分文字列を第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、上記見つけられた部分文字列を上記第2のパーサーでパーズするステップと、上記第1のパーサーでパーズして得られる第1の解析結果と、上記第2のパーサーでパーズして得られる第2の解析結果とから構文木を上記メモリ内に作成するステップとを含む。
(2)当該方法の他の実施態様は、検査されるべきデータをメモリ内に受け取るステップと、第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能であり且つ上記データの先頭文字列を含む少なくとも1つの部分文字列を上記データ中から見つけるステップと、上記見つけられた部分文字列を第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、当該第1のパーサーでパーズして得られる第1の解析結果から構文木を上記メモリ内に作成するステップとを含む。
情報が抽出されるべき又は検査されるべきデータ(以下、単に対象データともいう)は例えば、プロジェクト成果物文書、ソフトウェアの仕様書、数式又はプログラミング言語を含む文書であるがこれらに限定されない。
対象データでは、重要な情報がしばしば独自の記法を取り入れた自然文で記述されうる。また、対象データでは、全体の構造は既存の形式言語パーサーで扱えるような規則性をもっていることを仮定できるケースが多く、一方個々の中身の記述は自由度が高いことが多い。
対象データでは、重要な情報がしばしば独自の記法を取り入れた自然文で記述されうる。また、対象データでは、全体の構造は既存の形式言語パーサーで扱えるような規則性をもっていることを仮定できるケースが多く、一方個々の中身の記述は自由度が高いことが多い。
本発明の実施態様において、本発明の実施態様に従う組み合わせパーサーは、情報が抽出されるべきデータ、例えばプロジェクト成果物文書データ、数式又はプログラミング言語を含む文書データから情報を抽出するために使用されうる。
また、本発明の実施態様において、本発明の実施態様に従う組み合わせパーサーは、データを機械的に検査するために使用されうる。機械的な検査は、例えば、検査されるべきデータ、例えばプロジェクト成果物文書データ、数式又はプログラミング言語を含む文書データから、当該文書データの形式、内容の検査のために使用されうる。
以下では、図面に従って、本発明の実施形態をさらに説明する。また、以下の図を通して、特に断らない限り、同一の符号は、同一の対象を指す。
図2は、本発明の実施形態において使用されうるコンピュータ・ハードウェアの基本的なブロック図を示す。
コンピュータ(201)は、CPU(202)とメイン・メモリ(203)とを備えており、これらはバス(204)に接続されている。CPU(202)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ又はSempron(商標)が使用されうる。バス(204)には、ディスプレイ・コントローラ(205)を介して、ディスプレイ(206)、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ(206)は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス(204)にはまた、SATA又はIDEコントローラ(207)を介して、ディスク(208)、例えばハードディスク又はシリコン・ディスクと、ドライブ(209)、例えばCD、DVD又はBDドライブとが接続されうる。バス(204)にはさらに、キーボード・マウスコントローラ(210)又はUSBバス(図示せず)を介して、キーボード(211)及びマウス(212)が接続されうる。
コンピュータ(201)は、CPU(202)とメイン・メモリ(203)とを備えており、これらはバス(204)に接続されている。CPU(202)は好ましくは、32ビット又は64ビットのアーキテクチャに基づくものであり、例えば、インテル社のCore i(商標)シリーズ、Core 2(商標)シリーズ、Atom(商標)シリーズ、Xeon(商標)シリーズ、Pentium(登録商標)シリーズ、Celeron(登録商標)シリーズ、AMD社のPhenom(商標)シリーズ、Athlon(商標)シリーズ、Turion(商標)シリーズ又はSempron(商標)が使用されうる。バス(204)には、ディスプレイ・コントローラ(205)を介して、ディスプレイ(206)、例えば液晶ディスプレイ(LCD)が接続されうる。ディスプレイ(206)は、コンピュータの管理のために、通信回線を介してネットワークに接続されたコンピュータについての情報と、そのコンピュータ上で動作中のソフトウェアについての情報を、適当なグラフィック・インタフェースで表示するために使用される。バス(204)にはまた、SATA又はIDEコントローラ(207)を介して、ディスク(208)、例えばハードディスク又はシリコン・ディスクと、ドライブ(209)、例えばCD、DVD又はBDドライブとが接続されうる。バス(204)にはさらに、キーボード・マウスコントローラ(210)又はUSBバス(図示せず)を介して、キーボード(211)及びマウス(212)が接続されうる。
ディスク(208)には、オペレーティング・システム、J2EEなどのJava(登録商標)処理環境、Java(登録商標)アプリケーション、Java(登録商標)仮想マシン(VM)、Java(登録商標)JITコンパイラを提供するプログラム、その他のプログラム、及びデータが、メイン・メモリにロード可能に記憶されうる。
ドライブ(209)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(208)にインストールするために使用される。
ドライブ(209)は、必要に応じて、CD−ROM、DVD−ROM又はBDからプログラムをディスク(208)にインストールするために使用される。
通信インタフェース(214)は、例えばイーサネット(登録商標)・プロトコルに従う。通信インタフェース(214)は、通信コントローラ(213)を介してバス(204)に接続され、コンピュータ(201)を通信回線(215)に物理的に接続する役割を担い、コンピュータ(201)のオペレーティング・システムの通信機能のTCP/IP通信プロトコルに対して、ネットワーク・インタフェース層を提供する。なお、通信回線は、有線LAN環境、或いは例えばIEEE802.11a/b/g/nなどの無線LAN接続規格に基づく無線LAN環境であってもよい。
図3は、図2に示すコンピュータ(201)のうち、本発明の実施態様である、言語処理パーサーを組み合わせて、組み合わせパーサー(310)を自動的に生成するパーサー生成装置(301)の機能ブロック図を示す。
パーサー生成装置(301)は、宣言的記述エディタ部(302)(以下、単に、第1のエディタ部(302)ともいう)、自然言語処理登録エディタ部(303)(以下、単に、第2のエディタ部(303)ともいう)、組み合わせパターン登録ストア(304)、自然言語処理登録ストア(305)、組み合わせパターン解釈部(306)(以下、単に、解釈部(306)ともいう)、自然言語処理関数割当部(307)(以下、単に、割当部(307)ともいう)、組み合わせパターンに従ってコードを生成するパーサー生成部(308)(以下、第1のパーサー生成部ともいう)、及び形式言語処理パーサー生成部(309)(以下、第2のパーサー生成部ともいう)を備えている。なお、パーサー生成装置(301)は、1又は複数のコンピュータから構成されていてもよい。また、登録ストア(304、305)は、パーサー生成装置(301)と無線又は有線ネットワーク(図示せず)を介して接続された外部記憶媒体、例えばNASであってもよい。
パーサー生成装置(301)は、宣言的記述エディタ部(302)(以下、単に、第1のエディタ部(302)ともいう)、自然言語処理登録エディタ部(303)(以下、単に、第2のエディタ部(303)ともいう)、組み合わせパターン登録ストア(304)、自然言語処理登録ストア(305)、組み合わせパターン解釈部(306)(以下、単に、解釈部(306)ともいう)、自然言語処理関数割当部(307)(以下、単に、割当部(307)ともいう)、組み合わせパターンに従ってコードを生成するパーサー生成部(308)(以下、第1のパーサー生成部ともいう)、及び形式言語処理パーサー生成部(309)(以下、第2のパーサー生成部ともいう)を備えている。なお、パーサー生成装置(301)は、1又は複数のコンピュータから構成されていてもよい。また、登録ストア(304、305)は、パーサー生成装置(301)と無線又は有線ネットワーク(図示せず)を介して接続された外部記憶媒体、例えばNASであってもよい。
第1のエディタ部(302)はパターン記述エディタを含み、ユーザが当該パターン記述エディタを用いて組み合わせ文法記述パターンを含む宣言的記述を編集することを許すためのインターフェイス装置である。組み合わせ文法記述は、パーサーの動作を表す式でもある。この組み合わせ文法記述は、情報の抽出対象である入力テキストの特徴又は目的に応じて、下記に述べる本発明で追加され且つ拡張された文法記述を用いて記述される。ユーザは、第1のエディタ部(302)を使用し、情報の抽出対象であるテキストの特徴又は目的に応じて、図6に記載の文法記述を使用して宣言的記述を作成する。
第2のエディタ部(303)はエディタを含み、ユーザが当該エディタを用いて自然言語処理(N)(例えば自然言語処理関数(NP))を自然言語処理登録ストア(305)へ登録すること、及び自然言語処理(N)を自然言語処理登録ストア(305)から削除することなどを許すためのインターフェイス装置である。なお、パーサー生成装置(301)は、第1のエディタ部(302)と第2のエディタ部(303)との各機能が統合されたエディタ部を備えていてもよい。なお、第2のエディタ部(303)のエディタは、第1のエディタ部(302)によって実現されてもよい。
組み合わせパターン登録ストア(304)は、第1のエディタ部(302)において入力された組み合わせ文法記述パターンを記録する。当該記録によって、組み合わせ文法記述の保守が容易になり、また組み合わせ文法記述の再利用が可能となる。
自然言語処理登録ストア(305)は、利用可能な自然言語処理(N)、例えば自然言語処理関数(NP)の名前と、当該Nの実際の処理関数との対応関係を保存する。
解釈部(306)は、宣言的記述をメモリ(203)内に受け取り、宣言的記述中に記載された組み合わされたパターンを解釈する。そして、解釈されたパターンに基づいて、組み合わせパーサーのコードが、割当部(307)、第1のパーサー生成部(308)若しくは第2のパーサー生成部(309)、又はそれらの組み合わせによって生成される。「組み合わせパーサー」の「組み合わせ」とは、一方のパーサーが受理できなかった入力文字列のパーズを他のパーサーが引き受けてパーズすることをまた意味しうる。
割当部(307)は、宣言的記述において文字列処理関数、例えば自然言語処理名が記述されている場合に、当該自然言語処理名に関連付けられた処理関数を自然言語処理登録ストア(305)から取り出し、組み合わせパーサー(310)のコード中に当該取り出された処理関数又は当該処理関数の呼び出しコードを挿入する。
第1のパーサー生成部(308)は、宣言的記述において上記拡張された文法記述が記述されている場合、各拡張された文法記述に従った処理を行うコードをメモリ(203)内に自動的に生成し、組み合わせパーサー(310)のコード中に当該生成されたコード又は当該コードの呼び出しコードを挿入する。
第2のパーサー生成部(309)は、宣言的記述において従来技術である文法記述、例えばPEGが記述されている場合、当該各PEGに従った処理を行うコードをメモリ(203)内に自動的に生成し、組み合わせパーサー(310)のコード中に当該生成されたコード又は当該コードの呼び出しコードを挿入する。
組み合わせパターンから作成された組み合わせパーサー(310)は、入力文字列から情報を抽出するために使用される。なお、当該抽出の前に、組み合わせパーサー(310)は、コンパイラによって実行コードに変換される。
図4は、図3に示すパーサー生成装置(301)によって生成された組み合わせパーサー(310)を使用して、入力文字列(413)から情報を抽出し又は検査する情報抽出装置(401)の機能ブロック図を示す。
情報抽出装置(401)は、コンパイラ(402)及びパーサー実行部(403)を備えている。
コンパイラ(402)は、図3に示すパーサー生成装置によって生成された組み合わせパーサー(コードである)(411)をコンパイルして実行可能なコード(実行コード)(412)を生成する。
パーサー実行部(403)は、成果物文書(413)を実行コード(412)でパーズし、例えば抽象構文木(414)をパーズ結果として返す。
情報抽出装置(401)は、コンパイラ(402)及びパーサー実行部(403)を備えている。
コンパイラ(402)は、図3に示すパーサー生成装置によって生成された組み合わせパーサー(コードである)(411)をコンパイルして実行可能なコード(実行コード)(412)を生成する。
パーサー実行部(403)は、成果物文書(413)を実行コード(412)でパーズし、例えば抽象構文木(414)をパーズ結果として返す。
本発明の実施態様として、パーサー実行部(403)は、文字列検索部(404)、fpによるパーズ処理部(405)、nによるパーズ処理部(406)、及び構文木構築部(407)を含みうる。
以下では、パーサー実行部(403)を、P = P1 F P2において、P1がNPであり且つP2がFPである場合(P = NP F FP)の処理関数For[np,fp]を例として、その動きを説明する。なお、s(i,j)は、入力文字列sのうちのindex i〜(j-1)の文字列である。また、s(k,..)は、入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
文字列検索部(404)は、成果物文書(413)を受け取り、成果物文書中の文字列について、FPが受理可能な最初の部分文字列str(k,l)を見つける。
fpによるパーズ処理部(405)は、パーサーfpで文字列str(k,..)をパーズする。
nによるパーズ処理部(406)は、パーサーnで文字列str(0,k-1)をパーズする。
構文木構築部(407)は、fpによるパーズ処理部(405)からのパーズ結果として抽象構文木AST1を生成し、且つnによるパーズ処理部(406)からのパーズ結果として抽象構文木AST2を生成する。構文木構築部(407)は、またルートをFとし、AST1及びAST2を子ノードとする抽象構文木AST(414)を生成する。
そして、パーサー実行部(403)は、抽象構文木AST(414)と残りの部分文字列(415)とを返す。
以下では、パーサー実行部(403)を、P = P1 F P2において、P1がNPであり且つP2がFPである場合(P = NP F FP)の処理関数For[np,fp]を例として、その動きを説明する。なお、s(i,j)は、入力文字列sのうちのindex i〜(j-1)の文字列である。また、s(k,..)は、入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
文字列検索部(404)は、成果物文書(413)を受け取り、成果物文書中の文字列について、FPが受理可能な最初の部分文字列str(k,l)を見つける。
fpによるパーズ処理部(405)は、パーサーfpで文字列str(k,..)をパーズする。
nによるパーズ処理部(406)は、パーサーnで文字列str(0,k-1)をパーズする。
構文木構築部(407)は、fpによるパーズ処理部(405)からのパーズ結果として抽象構文木AST1を生成し、且つnによるパーズ処理部(406)からのパーズ結果として抽象構文木AST2を生成する。構文木構築部(407)は、またルートをFとし、AST1及びAST2を子ノードとする抽象構文木AST(414)を生成する。
そして、パーサー実行部(403)は、抽象構文木AST(414)と残りの部分文字列(415)とを返す。
図5は、図3に示す形式言語処理パーサー生成部(309)で使用されうる既存の文法記述の例を示す。
以下は、PEGを例にして示すが、本発明はPEGのみに限定されるものではないことを理解されたい。
文法Gは、(A,S,Σ,Z,R)で定義される。文法Gは、Pの定義の一部、及びZを除いてPEGと同様の意味を持つ。定義A,S,Σ,Z及びRの各意味は、図5に記載されている通りである。
以下は、PEGを例にして示すが、本発明はPEGのみに限定されるものではないことを理解されたい。
文法Gは、(A,S,Σ,Z,R)で定義される。文法Gは、Pの定義の一部、及びZを除いてPEGと同様の意味を持つ。定義A,S,Σ,Z及びRの各意味は、図5に記載されている通りである。
文法Gから、各パーサーは下記のように生成される。すなわち、パーサーの生成は、各ルール X::=P ∈R に対して、Pの形によって図5に定義されている各ルールの処理を再帰的に行うことによって行われる。
ルールX::=P のPから生成されるコードをXに関連付けられたパーサーとする。なお、X::= … の形のルールはR内に1つしかない。この制限は、PEGの制限によるものである。
また、sに関連付けられたパーサーが、文法Gに従うパーズを行うパーサーとなる。
ルールX::=P のPから生成されるコードをXに関連付けられたパーサーとする。なお、X::= … の形のルールはR内に1つしかない。この制限は、PEGの制限によるものである。
また、sに関連付けられたパーサーが、文法Gに従うパーズを行うパーサーとなる。
文法記述P = sの場合、第2のパーサー生成部(309)は、入力文字列が文字列sを先頭文字列として含むか検査し、入力文字列の先頭が文字列sから始まる場合はsを受理し、この受理した部分の構文木と入力文字列から先頭文字列sを除いた文字列を返す。例えば入力文字列abcdefをパーサーabでパーズした場合、先頭文字列abが受理されて、この受理された部分の構文木が作られて、入力文字列からabが消費される。そして、abの構文木と残りの文字列cdefとがパーズ結果として返される。一方、第2のパーサー生成部(309)は、入力文字列の先頭が文字列sから始まっていない場合には、パーズ・エラーを返す、というコードを生成する。
文法記述P = eoiの場合、第2のパーサー生成部(309)は、入力文字列が空の場合にはパーズ成功を返し、一方、入力文字列が空でない場合にはパーズ・エラーを返す、というコードを生成する。
文法記述P = Xの場合、第2のパーサー生成部(309)は、Rの中に含まれる X::=P’ のP’から生成したコード(Xに対するパーサー)を呼び出す、というコードを生成する。
文法記述P = P1 ; P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をp1でまずパーズし、残りの入力文字列をp2でパーズする、というコードを生成する。
文法記述P = P1 / P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をp1でパーズし、p1でのパーズが失敗したら同じ入力文字列をp2でパーズする、というコードを生成する。
文法記述P = P*の場合、第2のパーサー生成部(309)は、Pから部分パーサーpを再帰的に生成し、pに従って任意回数グリーディー(greedy)に繰り返しパーズする、というコードを生成する。
文法記述P = &(P1)P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をパーサーp1で肯定先読み(p1によるパーズが成功することをチェックすること)を行い、肯定先読みが成功した場合には同じ入力文字列をp2でパーズし、一方、肯定先読みが失敗した場合には何も行わない、というコードを生成する。
文法記述P = !(P1)P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をパーサーp1で否定先読み(p1によるパーズが失敗することをチェックすること)を行い、否定先読みが成功した場合には同じ入力文字列をp2でパーズし、一方、否定先読みが失敗した場合には何も行わない、というコードを生成する。
文法記述P = eoiの場合、第2のパーサー生成部(309)は、入力文字列が空の場合にはパーズ成功を返し、一方、入力文字列が空でない場合にはパーズ・エラーを返す、というコードを生成する。
文法記述P = Xの場合、第2のパーサー生成部(309)は、Rの中に含まれる X::=P’ のP’から生成したコード(Xに対するパーサー)を呼び出す、というコードを生成する。
文法記述P = P1 ; P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をp1でまずパーズし、残りの入力文字列をp2でパーズする、というコードを生成する。
文法記述P = P1 / P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をp1でパーズし、p1でのパーズが失敗したら同じ入力文字列をp2でパーズする、というコードを生成する。
文法記述P = P*の場合、第2のパーサー生成部(309)は、Pから部分パーサーpを再帰的に生成し、pに従って任意回数グリーディー(greedy)に繰り返しパーズする、というコードを生成する。
文法記述P = &(P1)P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をパーサーp1で肯定先読み(p1によるパーズが成功することをチェックすること)を行い、肯定先読みが成功した場合には同じ入力文字列をp2でパーズし、一方、肯定先読みが失敗した場合には何も行わない、というコードを生成する。
文法記述P = !(P1)P2の場合、第2のパーサー生成部(309)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、入力文字列をパーサーp1で否定先読み(p1によるパーズが失敗することをチェックすること)を行い、否定先読みが成功した場合には同じ入力文字列をp2でパーズし、一方、否定先読みが失敗した場合には何も行わない、というコードを生成する。
図6は、図5に示す既存の文法記述に、本発明の実施態様において新たに追加される文法記述の例を示す。
図6は、文法Gのうち、Rを示す。当該Rにおいて、本発明の実施態様において新たに導入される文法記述の3種類が示されている。
導入された文法記述は、下記の3種類である:
文法記述P = N:文法記述Nは、FP以外の文字列処理(N)、例えば自然言語処理関数(NP)によりパーズすることを示す。FP以外の文字列処理(N)は、具体的には自然言語処理名Nに割り当てられる処理関数を呼び出すことによって行われる。
文法記述P = P1 U P2:文法記述P1 U P2は、P1 until P2の意味である。文法記述P1 U P2は、入力文字列に対して、入力文字列の先頭文字列から、P2で最初に受理可能な入力文字列の直前の入力文字列までをP1でパーズすること、その後、残りの入力文字列をP2でパーズすることを示す。一方、入力文字列に対して、P2で受理可能な部分文字列がない場合、パーズ・エラーが返される。
文法記述P = P1 F P2:文法記述P1 F P2は、P1 for P2の意味である。文法記述P1 F P2は、入力文字列に対して、入力文字列の先頭文字列からP2で受理可能な部分文字列までをパーズすること、その後、P2で受理した部分文字列をP1でパーズすることを示す。一方、入力文字列に対して、入力文字列の先頭文字列にP2で受理可能な文字列がない場合、パーズ・エラーが返される。
図6は、文法Gのうち、Rを示す。当該Rにおいて、本発明の実施態様において新たに導入される文法記述の3種類が示されている。
導入された文法記述は、下記の3種類である:
文法記述P = N:文法記述Nは、FP以外の文字列処理(N)、例えば自然言語処理関数(NP)によりパーズすることを示す。FP以外の文字列処理(N)は、具体的には自然言語処理名Nに割り当てられる処理関数を呼び出すことによって行われる。
文法記述P = P1 U P2:文法記述P1 U P2は、P1 until P2の意味である。文法記述P1 U P2は、入力文字列に対して、入力文字列の先頭文字列から、P2で最初に受理可能な入力文字列の直前の入力文字列までをP1でパーズすること、その後、残りの入力文字列をP2でパーズすることを示す。一方、入力文字列に対して、P2で受理可能な部分文字列がない場合、パーズ・エラーが返される。
文法記述P = P1 F P2:文法記述P1 F P2は、P1 for P2の意味である。文法記述P1 F P2は、入力文字列に対して、入力文字列の先頭文字列からP2で受理可能な部分文字列までをパーズすること、その後、P2で受理した部分文字列をP1でパーズすることを示す。一方、入力文字列に対して、入力文字列の先頭文字列にP2で受理可能な文字列がない場合、パーズ・エラーが返される。
文法Gに新たに追加された上記文法記述から、各パーサーは下記のように生成される。
文法記述P = Nの場合、割当部(307)は、自然言語処理ストアから名前Nに関連付けられた自然言語処理関数np(例えば、自然言語処理パーサーである)を取り出し、入力文字列をnpでパーズする、というコードを生成する。
文法記述P = P1 U P2の場合、第1のパーサー生成部(308)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、例えば下記図9に示すフローチャートに従い動作するコードを生成する。
文法記述P = P1 F P2の場合、第1のパーサー生成部(308)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、例えば下記図10に示すフローチャートに従い動作するコードを生成する。
文法記述P = Nの場合、割当部(307)は、自然言語処理ストアから名前Nに関連付けられた自然言語処理関数np(例えば、自然言語処理パーサーである)を取り出し、入力文字列をnpでパーズする、というコードを生成する。
文法記述P = P1 U P2の場合、第1のパーサー生成部(308)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、例えば下記図9に示すフローチャートに従い動作するコードを生成する。
文法記述P = P1 F P2の場合、第1のパーサー生成部(308)は、P1,P2から部分パーサーp1,p2を再帰的に作成し、例えば下記図10に示すフローチャートに従い動作するコードを生成する。
図7は、図6に示す新たに追加された文法記述に関連付けられたパーサーのパーズ動作を模式図で示す。
図7aの例では、入力文字列はsであり、具体的には、s = s1s2s3s4である。既存のPEGのみでは、図7aのNで示される部分にNを適用することを指定することができない。そこで、本発明の実施態様では、組み合わせパターンN U FPを使用する。N U FPは、文法記述P1 U P2に従っている。図7aの組み合わせパーサーの処理は次の通りである:(1)入力文字列の先頭文字列から部分文字列s3の直前までに、FPで最初に受理可能な部分文字列が存在せず、文字列s3部分がFPにより受理可能な最初の部分文字列であるとする;(2)よって、先頭文字列から部分文字列s3の直前まで、すなわち部分文字列s1s2がNでパーズされ、残りの文字列s3s4において、s3部分がFPによりパーズされる;(3)Nにより部分文字列s1s2から抽象構文木1(以下、AST1ともいう)が構築される;FPにより部分文字列s3から抽象構文木2(以下、AST2ともいう)が構築される;そして、AST1とAST2はルートUによって結合されて、Uをルートとする抽象構文木a(以下、ASTaともいう)が構築される;(4)結果として、ASTaと、残りの部分文字列s4が、N U FPによる文字列s1s2s3s4に対するパーズ結果として返される。
図7bの例では、入力文字列はsであり、具体的には、s = s1s2である。既存のPEGのみでは、図7bのNで示される部分にNを適用することを指定することができない。そこで、本発明の実施態様では、組み合わせパターンN F FPを使用する。N F FPは、文法記述P1 F P2に従っている。図7aの組み合わせパーサーの処理は次の通りである:(1)入力文字列の先頭文字列s1がFPにより受理可能である;(2)FPにより受理可能な先頭文字列s1が切り出され、当該切り出されたs1がNによりパーズされる;(3)Nによるパーズの結果、部分文字列s1から抽象構文木b(以下、ASTbともいう)が構築される;(4)結果として、ASTbと、残りの部分文字列s2がN F FPによる文字列s1s2に対するパーズ結果として返される。
図7aの例では、入力文字列はsであり、具体的には、s = s1s2s3s4である。既存のPEGのみでは、図7aのNで示される部分にNを適用することを指定することができない。そこで、本発明の実施態様では、組み合わせパターンN U FPを使用する。N U FPは、文法記述P1 U P2に従っている。図7aの組み合わせパーサーの処理は次の通りである:(1)入力文字列の先頭文字列から部分文字列s3の直前までに、FPで最初に受理可能な部分文字列が存在せず、文字列s3部分がFPにより受理可能な最初の部分文字列であるとする;(2)よって、先頭文字列から部分文字列s3の直前まで、すなわち部分文字列s1s2がNでパーズされ、残りの文字列s3s4において、s3部分がFPによりパーズされる;(3)Nにより部分文字列s1s2から抽象構文木1(以下、AST1ともいう)が構築される;FPにより部分文字列s3から抽象構文木2(以下、AST2ともいう)が構築される;そして、AST1とAST2はルートUによって結合されて、Uをルートとする抽象構文木a(以下、ASTaともいう)が構築される;(4)結果として、ASTaと、残りの部分文字列s4が、N U FPによる文字列s1s2s3s4に対するパーズ結果として返される。
図7bの例では、入力文字列はsであり、具体的には、s = s1s2である。既存のPEGのみでは、図7bのNで示される部分にNを適用することを指定することができない。そこで、本発明の実施態様では、組み合わせパターンN F FPを使用する。N F FPは、文法記述P1 F P2に従っている。図7aの組み合わせパーサーの処理は次の通りである:(1)入力文字列の先頭文字列s1がFPにより受理可能である;(2)FPにより受理可能な先頭文字列s1が切り出され、当該切り出されたs1がNによりパーズされる;(3)Nによるパーズの結果、部分文字列s1から抽象構文木b(以下、ASTbともいう)が構築される;(4)結果として、ASTbと、残りの部分文字列s2がN F FPによる文字列s1s2に対するパーズ結果として返される。
図8は、図5に示す文法記述を使用して、本発明の実施態様である組み合わせパーサーを生成する処理Main[STORE]のうち、パーサーpを生成する処理Gen[STORE](p)のフローチャートを示す。
以下に、Main[STORE]及びGen[STORE](p)の各処理で使用されている定義を説明する。
STORE:自然言語処理登録ストア(305)である。
P:文法記述である。文法記述は、例えばユーザによって、所定の文法に従い宣言的記述中に記載される。
Main[STORE]:自然言語処理登録ストア(305)のもとで、文法記述Pから組み合わせパーサーpを生成する処理である。
Gen[STORE](P):Main[STORE]のうち、文法記述Pの組み合わせを特定し,当該特定された文法記述に従ってパーサーpを生成する処理である。
以下に、Main[STORE]及びGen[STORE](p)の各処理で使用されている定義を説明する。
STORE:自然言語処理登録ストア(305)である。
P:文法記述である。文法記述は、例えばユーザによって、所定の文法に従い宣言的記述中に記載される。
Main[STORE]:自然言語処理登録ストア(305)のもとで、文法記述Pから組み合わせパーサーpを生成する処理である。
Gen[STORE](P):Main[STORE]のうち、文法記述Pの組み合わせを特定し,当該特定された文法記述に従ってパーサーpを生成する処理である。
まず、Main[STORE]を説明する。
ステップ1 解釈部(306)は、第1のエディタ部(302)から文法記述Pを含む宣言的記述を受けとる。また、宣言的記述は、宣言的記述ライブラリーに予め登録されていてもよい。
ステップ2 解釈部(306)は、Gen[STORE](P)を実行する。
ステップ2−1 宣言的記述をパーズして、文法記述Pのトップレベルでの組み合わせパターンを特定する。文法記述Pは例えば、図6に示すs, eoi, X, P1;P2, P1/P2, P*, &(P1)P2, !(P1)P2, N, P1 U P2及びP1 F P2 の何れかである。トップレベルとは、文法記述が表している、一番外側の組み合わせである。例えば、文法記述Pが((P1;P2) U P3)である場合にトップレベルでの組み合わせは、Uで組み合わされている(P1;P2)とP3とである。また、特定された文法記述PがP1; (P2 U P3)である場合にトップレベルでの組み合わせは、;で組み合わされているP1と(P2 U P3)とである。トップレベル以下の下位レベルにおける組み合わせパターンの特定は、図8のステップ808、810、813、815、及び818のGenの再帰的な適用により行われる。
ステップ2−2−1 文法記述Pが、s, eoi, X及びNの何れかである場合、当該特定された文法記述Pからパーサーpが生成されうる。s, eoi及びXのパーサーについては、第2のパーサー生成部(309)が、PEGにおける既存技術に従い生成しうる。Nのパーサーについては、割当部(307)が図8のステップ808〜812に示す処理に従い生成しうる。
ステップ2−2−2−1 第1のパーサー生成部(308)が、文法記述P1からパーサーp1を生成する。例えば、特定された文法記述Pが((P1;P2) U P3)である場合に、P1は(P1;P2)である。また、特定された文法記述PがP1; (P2 U P3)である場合に、P1はP1である。第1のパーサー生成部(308)は、Gen[STORE](p1)を再帰的に呼び出す。
ステップ2−2−2−2 第1のパーサー生成部(308)が、文法記述P2からパーサーp2を生成する。例えば、特定された文法記述Pが((P1;P2) U P3)である場合に、P2はP3である。また、特定された文法記述PがP1; (P2 U P3)である場合に、P2は(P2 U P3)である。第1のパーサー生成部(308)は、Gen[STORE](P2 U P3))を再帰的に呼び出し、この呼び出しにおいてはトップレベルの組み合わせパターンがP2とP3がUで組み合わされていると特定されてさらに分解される。
ステップ2−2−2−3 第1のパーサー生成部(308)が、特定された組み合わせパターンに従って、パーサーp1とパーサーp2とを組み合わせて組み合わせパーサーpを生成する。ここで、組み合わせパーサーpの生成は、ステップ2−1で特定された組み合わせパターンごとに決定される。
ステップ3 解釈部(306)は、ステップ2−2−2−3からのパーサーpのコード又は、パーサーpの実行オブジェクト(例えば、関数への参照)を返す。
ステップ1 解釈部(306)は、第1のエディタ部(302)から文法記述Pを含む宣言的記述を受けとる。また、宣言的記述は、宣言的記述ライブラリーに予め登録されていてもよい。
ステップ2 解釈部(306)は、Gen[STORE](P)を実行する。
ステップ2−1 宣言的記述をパーズして、文法記述Pのトップレベルでの組み合わせパターンを特定する。文法記述Pは例えば、図6に示すs, eoi, X, P1;P2, P1/P2, P*, &(P1)P2, !(P1)P2, N, P1 U P2及びP1 F P2 の何れかである。トップレベルとは、文法記述が表している、一番外側の組み合わせである。例えば、文法記述Pが((P1;P2) U P3)である場合にトップレベルでの組み合わせは、Uで組み合わされている(P1;P2)とP3とである。また、特定された文法記述PがP1; (P2 U P3)である場合にトップレベルでの組み合わせは、;で組み合わされているP1と(P2 U P3)とである。トップレベル以下の下位レベルにおける組み合わせパターンの特定は、図8のステップ808、810、813、815、及び818のGenの再帰的な適用により行われる。
ステップ2−2−1 文法記述Pが、s, eoi, X及びNの何れかである場合、当該特定された文法記述Pからパーサーpが生成されうる。s, eoi及びXのパーサーについては、第2のパーサー生成部(309)が、PEGにおける既存技術に従い生成しうる。Nのパーサーについては、割当部(307)が図8のステップ808〜812に示す処理に従い生成しうる。
ステップ2−2−2−1 第1のパーサー生成部(308)が、文法記述P1からパーサーp1を生成する。例えば、特定された文法記述Pが((P1;P2) U P3)である場合に、P1は(P1;P2)である。また、特定された文法記述PがP1; (P2 U P3)である場合に、P1はP1である。第1のパーサー生成部(308)は、Gen[STORE](p1)を再帰的に呼び出す。
ステップ2−2−2−2 第1のパーサー生成部(308)が、文法記述P2からパーサーp2を生成する。例えば、特定された文法記述Pが((P1;P2) U P3)である場合に、P2はP3である。また、特定された文法記述PがP1; (P2 U P3)である場合に、P2は(P2 U P3)である。第1のパーサー生成部(308)は、Gen[STORE](P2 U P3))を再帰的に呼び出し、この呼び出しにおいてはトップレベルの組み合わせパターンがP2とP3がUで組み合わされていると特定されてさらに分解される。
ステップ2−2−2−3 第1のパーサー生成部(308)が、特定された組み合わせパターンに従って、パーサーp1とパーサーp2とを組み合わせて組み合わせパーサーpを生成する。ここで、組み合わせパーサーpの生成は、ステップ2−1で特定された組み合わせパターンごとに決定される。
ステップ3 解釈部(306)は、ステップ2−2−2−3からのパーサーpのコード又は、パーサーpの実行オブジェクト(例えば、関数への参照)を返す。
以下に、上記ステップ2に記載のGen[STORE](p)の例をステップ801〜820に従い説明する。
ステップ801では、解釈部(306)は、第1のエディタ部(302)から文法記述Pを含む宣言的記述を受け取り、パーサーpを生成するために、Gen[STORE](P)を開始する。解釈部(306)は、宣言的記述をパーズして、まず文法記述のトップレベルでの組み合わせパターンを特定する。
ステップ801では、解釈部(306)は、第1のエディタ部(302)から文法記述Pを含む宣言的記述を受け取り、パーサーpを生成するために、Gen[STORE](P)を開始する。解釈部(306)は、宣言的記述をパーズして、まず文法記述のトップレベルでの組み合わせパターンを特定する。
ステップ802では、解釈部(306)は、特定された文法記述Pが自然言語処理Nであるかどうかを判定する。解釈部(306)は、Pが自然言語処理Nである場合にステップ803に進み、一方PがNでない場合にステップ804に進む。
ステップ803では、割当部(307)は、特定された文法記述Pが自然言語処理Nであることに応じて、STOREに登録された名前Nの自然言語処理関数を見つけ、変数nlpに代入する。
ステップ805では、割当部(307)は、nlpが空(null)でない場合にステップ806に進み、一方、nlpが空である場合にステップ807に進む。ステップ807はエラー処理であり、nlpが空であることに応じて、パーサー生成エラーのメッセージをパーサー生成装置に返す。そして、当該処理は、ステップ820に進む。
ステップ806では、割当部(307)は、nlpが空でないことに応じて、パーサーnlpを返す。返されるnlpは、自然言語処理関数Nに関連付けられた上記処理関数である。
ステップ803では、割当部(307)は、特定された文法記述Pが自然言語処理Nであることに応じて、STOREに登録された名前Nの自然言語処理関数を見つけ、変数nlpに代入する。
ステップ805では、割当部(307)は、nlpが空(null)でない場合にステップ806に進み、一方、nlpが空である場合にステップ807に進む。ステップ807はエラー処理であり、nlpが空であることに応じて、パーサー生成エラーのメッセージをパーサー生成装置に返す。そして、当該処理は、ステップ820に進む。
ステップ806では、割当部(307)は、nlpが空でないことに応じて、パーサーnlpを返す。返されるnlpは、自然言語処理関数Nに関連付けられた上記処理関数である。
ステップ804では、解釈部(306)は、特定された文法記述Pが自然言語処理Nでないことに応じて、PがP1 U P2であるかどうかを判定する。解釈部(306)は、PがP1 U P2である場合にステップ808に進み、一方PがP1 U P2でない場合にステップ809に進む。
ステップ808では、第1のパーサー生成部(308)は、文法記述P1からパーサーp1を生成する。当該生成の処理はGen[STORE](P1)で示される。
ステップ810では、第1のパーサー生成部(308)は、文法記述P2からパーサーp2を生成する。当該生成の処理はGen[STORE](P2)で示される。
ステップ811では、第1のパーサー生成部(308)は、ステップ808からのパーサーp1とステップ810からのパーサーp2とを組み合わせて、処理関数Until[p1,p2]を生成する。Until[p1,p2]は、組み合わせパーサーであり、strを引数とする関数のコードである。Until[p1,p2]の生成は、図9のUntil[p1,p2]のパーズ動作を示すフローチャートに該当する処理(コード)を生成することによって実現可能である。すなわち、図9のフローチャートはパラメータp1,p2を持つ関数を表しているので、p1,p2が与えられれば図9に対応する処理(コード)が決定されて実現可能である。
ステップ812では、第1のパーサー生成部(308)は、Until[p1,p2]を返す。そして、当該処理は、ステップ820に進む。
ステップ808では、第1のパーサー生成部(308)は、文法記述P1からパーサーp1を生成する。当該生成の処理はGen[STORE](P1)で示される。
ステップ810では、第1のパーサー生成部(308)は、文法記述P2からパーサーp2を生成する。当該生成の処理はGen[STORE](P2)で示される。
ステップ811では、第1のパーサー生成部(308)は、ステップ808からのパーサーp1とステップ810からのパーサーp2とを組み合わせて、処理関数Until[p1,p2]を生成する。Until[p1,p2]は、組み合わせパーサーであり、strを引数とする関数のコードである。Until[p1,p2]の生成は、図9のUntil[p1,p2]のパーズ動作を示すフローチャートに該当する処理(コード)を生成することによって実現可能である。すなわち、図9のフローチャートはパラメータp1,p2を持つ関数を表しているので、p1,p2が与えられれば図9に対応する処理(コード)が決定されて実現可能である。
ステップ812では、第1のパーサー生成部(308)は、Until[p1,p2]を返す。そして、当該処理は、ステップ820に進む。
ステップ809では、解釈部(306)は、特定された文法記述PがP1 U P2でないことに応じて、PがP1 F P2であるかどうかを判定する。解釈部(306)は、特定された文法記述PがP1 F P2である場合にステップ813に進み、一方PがP1 F P2でない場合にステップ814に進む。
ステップ813では、第1のパーサー生成部(308)は、文法記述P1からパーサーp1を生成する。当該生成の処理はGen[STORE](P1)で示される。
ステップ815では、第1のパーサー生成部(308)は、文法記述P2からパーサーp2を生成する。当該生成の処理はGen[STORE](P2)で示される。
ステップ816では、第1のパーサー生成部(308)は、ステップ813からのパーサーp1とステップ815からのパーサーp2とを組み合わせて、処理関数For[p1,p2]を生成する。For[p1,p2]は、組み合わせパーサーであり、strを引数とする関数のコードである。For[p1,p2]の生成は、図10のFor[p1,p2]のパーズ動作を示すフローチャートに該当する処理(コード)を生成することによって実現可能である。すなわち、図10のフローチャートはパラメータp1,p2を持つ関数を表しているので、p1,p2が与えられれば図10に対応する処理(コード)が決定されて実現可能である。
ステップ817では、第1のパーサー生成部(308)は、処理関数For[p1,p2]を返す。そして、当該処理は、ステップ820に進む。
ステップ813では、第1のパーサー生成部(308)は、文法記述P1からパーサーp1を生成する。当該生成の処理はGen[STORE](P1)で示される。
ステップ815では、第1のパーサー生成部(308)は、文法記述P2からパーサーp2を生成する。当該生成の処理はGen[STORE](P2)で示される。
ステップ816では、第1のパーサー生成部(308)は、ステップ813からのパーサーp1とステップ815からのパーサーp2とを組み合わせて、処理関数For[p1,p2]を生成する。For[p1,p2]は、組み合わせパーサーであり、strを引数とする関数のコードである。For[p1,p2]の生成は、図10のFor[p1,p2]のパーズ動作を示すフローチャートに該当する処理(コード)を生成することによって実現可能である。すなわち、図10のフローチャートはパラメータp1,p2を持つ関数を表しているので、p1,p2が与えられれば図10に対応する処理(コード)が決定されて実現可能である。
ステップ817では、第1のパーサー生成部(308)は、処理関数For[p1,p2]を返す。そして、当該処理は、ステップ820に進む。
ステップ814では、解釈部(306)は、特定された文法記述PがP1 F P2でないことに応じて、N, P1 U P2及びP1 F P2以外のルール(図6の点線で囲まれた部分以外のルール、すなわち既存のルール)であるかどうかを判定する。解釈部(306)は、Pが既存のルールである場合にステップ818に進み、一方Pが既存のルールでない場合にステップ807に進む。ステップ807はエラー処理であり、Pが既存のルールでない場合にことに応じて、パーサー生成エラーのメッセージをパーサー生成装置に返す。そして、当該処理は、ステップ820に進む。
ステップ818では、第2のパーサー生成部(309)は、既存のルールに従い、パーサーpを生成する。既存のルールに従いパーサーを生成するプロセスは、図5に記載の文法記述に関連付けられたパーサーの生成方法として上記したとおりである。そして、解釈部(306)は、必要に応じて、Gen[STORE]を再帰的に呼び出す。例えば、P = P1;P2の場合には、Gen[STORE](P1), Gen[Store](P2)が呼ばれるので、この2つの結果のパーサーを図6に示す文法記述;に従って組み合わせてパーサーを生成する。
ステップ819では、第2のパーサー生成部(309)は、パーサーpを返す。そして、当該処理は、ステップ820に進む。
ステップ820では、解釈部(306)は、Gen[STORE](P)を終了し、上記ステップ3に進む。
ステップ818では、第2のパーサー生成部(309)は、既存のルールに従い、パーサーpを生成する。既存のルールに従いパーサーを生成するプロセスは、図5に記載の文法記述に関連付けられたパーサーの生成方法として上記したとおりである。そして、解釈部(306)は、必要に応じて、Gen[STORE]を再帰的に呼び出す。例えば、P = P1;P2の場合には、Gen[STORE](P1), Gen[Store](P2)が呼ばれるので、この2つの結果のパーサーを図6に示す文法記述;に従って組み合わせてパーサーを生成する。
ステップ819では、第2のパーサー生成部(309)は、パーサーpを返す。そして、当該処理は、ステップ820に進む。
ステップ820では、解釈部(306)は、Gen[STORE](P)を終了し、上記ステップ3に進む。
ステップ806、ステップ812、ステップ817、ステップ819で返された処理関数はそのまま返されるか、宣言的記述中の文法記述に従って他に生成されたパーサーと組み合わされる。例えば、宣言的記述中の文法記述が、P1;(P2 U P3)である場合、再帰的に呼ばれたGen[STORE](P1)からパーサーp1が生成され、ステップ819で(P2 U P3)が返される。また、再帰的に呼ばれたGen[STORE](P2 U P3)から パーサーp23が生成され、ステップ812でパーサーUntil[p1,p2]が返される。その後、パーサーp1とパーサーp23が;により組み合わされたパーサーが、ステップ818において生成される。
図9は、図8のステップ811において生成される処理関数Until[p1,p2]のパーズ動作を示すフローチャートを示す。
以下に、フローチャートで使用されている定義を説明する。
p1,p2:パーサー関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(“U”,R1,R2):ラベルUを親ノードとし、抽象構文木R1とR2とを子ノードとして設定した新たな抽象構文木を作成する処理である。
以下に、フローチャートで使用されている定義を説明する。
p1,p2:パーサー関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(“U”,R1,R2):ラベルUを親ノードとし、抽象構文木R1とR2とを子ノードとして設定した新たな抽象構文木を作成する処理である。
ステップ901では、パーサー実行部(403)は、Until[p1,p2]で入力文字列をパーズする処理を開始する。
ステップ902では、パーサー実行部(403)は、Until[p1,p2]でパーズする入力文字列sを変数strに代入する。
ステップ903では、パーサー実行部(403)は、文字列のポインタを示す変数xを初期化する。当該初期化によって、文字列のポインタは入力文字列の先頭をさすように設定される。
ステップ904では、パーサー実行部(403)はstr.length()が変数xよりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも大きい場合に処理すべき文字列があることからステップ905に進み、一方、変数xがstr.length()よりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも小さい場合に処理すべき文字列がないことからステップ906に進む。ステップ904〜909の各処理は、入力文字列sの先頭から末端までのそれぞれの入力文字列について繰り返し行われる。ステップ906は、エラーを返すエラー処理である。
ステップ905では、パーサー実行部(403)は、入力文字列sのうち、変数xの位置から最後の文字列までの部分文字列を切り出し、当該切り出した部分文字列をS1に格納する。
ステップ907では、パーサー実行部(403)は、切り出した部分文字列S1をp2でパーズし、当該パーズが正常に終了した場合にp2でパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_1)として返し、且つ部分文字列S1のうちp2で処理されなかった残りの文字列を部分文字列str2として返す。
ステップ908では、パーサー実行部(403)は、p2が部分文字列S1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_1がエラーである場合には、p2でパーズ可能な部分文字列がまだ見つかっておらず、p2でパーズ可能な部分文字列を探すためにステップ909に進む。一方、パーサー実行部(403)は、R_1がエラーでない場合には、入力文字列にp2でパーズ可能な部分が見つかったのでステップ910に進む。
ステップ909では、パーサー実行部(403)は、変数xに1を加えて、文字列のポインタ位置を1ずらす。そして、当該処理はステップ904に戻り、ステップ904〜908が繰り返される。
ステップ910では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数xの位置の直前までの部分文字列を切り出し、当該切り出した部分文字列をS2に格納する。
ステップ911では、パーサー実行部(403)は、切り出した文字列S2をp1でパーズし、当該パーズが正常に終了した場合にp1でパーズされた結果を抽象構文木(R_2)として返し、且つ部分文字列S2のうちp1が処理しなかった残りの文字列をstr3として返す。str3は、p2が自然言語処理関数である場合に空の文字列εである。
ステップ912では、パーサー実行部(403)は、ステップ907からの抽象構文木(R_1)とステップ911からの抽象構文木(R_2)とをルートUで統合して、抽象構文木(R)を作成する。
ステップ913では、パーサー実行部(403)は、ステップ912からの抽象構文木(R)と、部分文字列S1のうちp2が処理しなかった残りの文字列str2(ステップ907から)とをパーズ結果として返す。
ステップ914では、パーサー実行部(403)は、Until[p1,p2]によるパーズ処理を終了する。
ステップ902では、パーサー実行部(403)は、Until[p1,p2]でパーズする入力文字列sを変数strに代入する。
ステップ903では、パーサー実行部(403)は、文字列のポインタを示す変数xを初期化する。当該初期化によって、文字列のポインタは入力文字列の先頭をさすように設定される。
ステップ904では、パーサー実行部(403)はstr.length()が変数xよりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも大きい場合に処理すべき文字列があることからステップ905に進み、一方、変数xがstr.length()よりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも小さい場合に処理すべき文字列がないことからステップ906に進む。ステップ904〜909の各処理は、入力文字列sの先頭から末端までのそれぞれの入力文字列について繰り返し行われる。ステップ906は、エラーを返すエラー処理である。
ステップ905では、パーサー実行部(403)は、入力文字列sのうち、変数xの位置から最後の文字列までの部分文字列を切り出し、当該切り出した部分文字列をS1に格納する。
ステップ907では、パーサー実行部(403)は、切り出した部分文字列S1をp2でパーズし、当該パーズが正常に終了した場合にp2でパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_1)として返し、且つ部分文字列S1のうちp2で処理されなかった残りの文字列を部分文字列str2として返す。
ステップ908では、パーサー実行部(403)は、p2が部分文字列S1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_1がエラーである場合には、p2でパーズ可能な部分文字列がまだ見つかっておらず、p2でパーズ可能な部分文字列を探すためにステップ909に進む。一方、パーサー実行部(403)は、R_1がエラーでない場合には、入力文字列にp2でパーズ可能な部分が見つかったのでステップ910に進む。
ステップ909では、パーサー実行部(403)は、変数xに1を加えて、文字列のポインタ位置を1ずらす。そして、当該処理はステップ904に戻り、ステップ904〜908が繰り返される。
ステップ910では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数xの位置の直前までの部分文字列を切り出し、当該切り出した部分文字列をS2に格納する。
ステップ911では、パーサー実行部(403)は、切り出した文字列S2をp1でパーズし、当該パーズが正常に終了した場合にp1でパーズされた結果を抽象構文木(R_2)として返し、且つ部分文字列S2のうちp1が処理しなかった残りの文字列をstr3として返す。str3は、p2が自然言語処理関数である場合に空の文字列εである。
ステップ912では、パーサー実行部(403)は、ステップ907からの抽象構文木(R_1)とステップ911からの抽象構文木(R_2)とをルートUで統合して、抽象構文木(R)を作成する。
ステップ913では、パーサー実行部(403)は、ステップ912からの抽象構文木(R)と、部分文字列S1のうちp2が処理しなかった残りの文字列str2(ステップ907から)とをパーズ結果として返す。
ステップ914では、パーサー実行部(403)は、Until[p1,p2]によるパーズ処理を終了する。
図10は、図8のステップ816において生成される処理関数For[p1,p2]のパーズ動作を示すフローチャートを示す。
以下に、フローチャートで使用されている定義を説明する。
p1,p2:P1,P2からそれぞれ生成されたパーサー関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(“F”,R1,R2):ラベルFを親ノードとし、抽象構文木R1とR2とを子ノードとして設定した新たな抽象構文木を作成する処理である。
以下に、フローチャートで使用されている定義を説明する。
p1,p2:P1,P2からそれぞれ生成されたパーサー関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(“F”,R1,R2):ラベルFを親ノードとし、抽象構文木R1とR2とを子ノードとして設定した新たな抽象構文木を作成する処理である。
ステップ1001では、パーサー実行部(403)は、For[p1,p2]で入力文字列をパーズする処理を開始する。
ステップ1002では、パーサー実行部(403)は、For[p1,p2]でパーズする入力文字列sを変数strに代入する。
ステップ1003では、パーサー実行部(403)は、文字列strをp2でパーズし、当該パーズが正常に終了した場合にp2でパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_2)として返し(図示せず)、且つ入力文字列のうちp2が処理しなかった残りの文字列を部分文字列str2として返す。
ステップ1004では、パーサー実行部(403)は、p2が部分文字列str2を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_2がエラーである場合には、入力文字列にまだp2で処理しうる部分がありうるのでステップ1005に進む。一方、パーサー実行部(403)は、R_2がエラーでない場合には、入力文字列にp2で処理しうる部分がないのでステップ1006に進む。ステップ1006は、エラーを返すエラー処理である。
ステップ1005では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から部分文字列str1の直前までの部分文字列を全体の入力文字列から差し引いた部分文字列str(0,str.length() - str2.length())を切り出し、当該切り出した部分文字列をS1に格納する。str(0,str.length() - str2.length())のうちのstr2はステップ903のstr2と同じである。
ステップ1007では、パーサー実行部(403)は、切り出した文字列S1をp1でパーズし、当該パーズが正常に終了した場合にp1でパーズされた結果を抽象構文木(R_1)として返し、且つ部分文字列S1のうちp1が処理しなかった残りの文字列をstr1として返す。str1は、Nが自然言語処理関数である場合に空の文字列εである。
ステップ1008では、パーサー実行部(403)は、ステップ1003からの抽象構文木(R_2)とステップ1006からの抽象構文木(R_1)とをルートFで統合して、抽象構文木(R)を作成する。なお、抽象構文木(R)を作成せずに、ステップ1006からの抽象構文木(R_1)と、ステップ1003でp2が処理しなかった残りの文字列str2とをパーズ結果として返すようにしてもよい。抽象構文木として、ステップ1006からの抽象構文木(R_1)のみを返すのは、抽象構文木を統合するとした場合、必要のない情報が抽象構文木に含まれることになり、後の後処理が煩雑になる場合も考えられるからである。
ステップ1009では、パーサー実行部(403)は、ステップ1008からの抽象構文木(R)と、ステップ1003で部分文字列S1のうちp2が処理しなかった残りの文字列str2とを返す。
ステップ1010では、パーサー実行部(403)は、For[p1,p2]によるパーズ処理を終了する。
ステップ1002では、パーサー実行部(403)は、For[p1,p2]でパーズする入力文字列sを変数strに代入する。
ステップ1003では、パーサー実行部(403)は、文字列strをp2でパーズし、当該パーズが正常に終了した場合にp2でパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_2)として返し(図示せず)、且つ入力文字列のうちp2が処理しなかった残りの文字列を部分文字列str2として返す。
ステップ1004では、パーサー実行部(403)は、p2が部分文字列str2を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_2がエラーである場合には、入力文字列にまだp2で処理しうる部分がありうるのでステップ1005に進む。一方、パーサー実行部(403)は、R_2がエラーでない場合には、入力文字列にp2で処理しうる部分がないのでステップ1006に進む。ステップ1006は、エラーを返すエラー処理である。
ステップ1005では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から部分文字列str1の直前までの部分文字列を全体の入力文字列から差し引いた部分文字列str(0,str.length() - str2.length())を切り出し、当該切り出した部分文字列をS1に格納する。str(0,str.length() - str2.length())のうちのstr2はステップ903のstr2と同じである。
ステップ1007では、パーサー実行部(403)は、切り出した文字列S1をp1でパーズし、当該パーズが正常に終了した場合にp1でパーズされた結果を抽象構文木(R_1)として返し、且つ部分文字列S1のうちp1が処理しなかった残りの文字列をstr1として返す。str1は、Nが自然言語処理関数である場合に空の文字列εである。
ステップ1008では、パーサー実行部(403)は、ステップ1003からの抽象構文木(R_2)とステップ1006からの抽象構文木(R_1)とをルートFで統合して、抽象構文木(R)を作成する。なお、抽象構文木(R)を作成せずに、ステップ1006からの抽象構文木(R_1)と、ステップ1003でp2が処理しなかった残りの文字列str2とをパーズ結果として返すようにしてもよい。抽象構文木として、ステップ1006からの抽象構文木(R_1)のみを返すのは、抽象構文木を統合するとした場合、必要のない情報が抽象構文木に含まれることになり、後の後処理が煩雑になる場合も考えられるからである。
ステップ1009では、パーサー実行部(403)は、ステップ1008からの抽象構文木(R)と、ステップ1003で部分文字列S1のうちp2が処理しなかった残りの文字列str2とを返す。
ステップ1010では、パーサー実行部(403)は、For[p1,p2]によるパーズ処理を終了する。
図11は、図9に示すP = P1 U P2において、P1がNPであり且つP2がFPである場合(P = NP U FP)の処理関数Until[np,fp]のパーズ動作を示すフローチャートを示す。
図11のフローチャートは、図7aの模式図で示されるパーズ動作に対応する。
以下に、図11のフローチャートで使用されている定義を説明する。
str:パーズしたい入力文字列(εは空の文字列)である。
fp:文法記述FPから生成されたパーサーであり、例えば形式言語処理パーサーである。
np:文法記述NPから生成されたパーサーであり、例えば自然言語処理関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(R1,R2):構文木R1とR2とを子ノードとして合わせた構文木の作成する関数である。
fp(S), np(S):文字列Sをfp又はnpでパーズして結果を返すことを示す。
図11のフローチャートは、図7aの模式図で示されるパーズ動作に対応する。
以下に、図11のフローチャートで使用されている定義を説明する。
str:パーズしたい入力文字列(εは空の文字列)である。
fp:文法記述FPから生成されたパーサーであり、例えば形式言語処理パーサーである。
np:文法記述NPから生成されたパーサーであり、例えば自然言語処理関数である。
s(i,j):入力文字列sのうちのindex i〜(j-1)の文字列である。
s(k,..):入力文字列sのうちのindex k〜(s.length()-1)の文字列である。
AST(R1,R2):構文木R1とR2とを子ノードとして合わせた構文木の作成する関数である。
fp(S), np(S):文字列Sをfp又はnpでパーズして結果を返すことを示す。
ステップ1101では、パーサー実行部(403)は、Until[np,fp]で入力文字列をパーズする処理を開始する。
ステップ1102では、パーサー実行部(403)は、Until[np,fp]でパーズする入力文字列sを変数strに代入する。
ステップ1103では、パーサー実行部(403)は、文字列のポインタを示す変数xを初期化する。当該初期化によって、文字列のポインタは入力文字列の先頭をさすように設定される。
ステップ1104では、パーサー実行部(403)はstr.length()が変数xよりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも大きい場合に処理すべき文字列があることからステップ1105に進み、一方、変数xがstr.length()よりも大きい場合、すなわち入力文字列の長さが文字列のポインタ位置よりも小さい場合に処理すべき文字列がないことからステップ1106に進む。ステップ1104〜1109の各処理は、入力文字列sの先頭から末端までのそれぞれの入力文字列について繰り返し行われる。ステップ1106は、エラーを返すエラー処理である。
ステップ1105では、パーサー実行部(403)は、入力文字列sのうち、変数xの位置から最後の文字列までの部分文字列を切り出し、当該切り出した部分文字列をS1に格納する。
ステップ1107では、パーサー実行部(403)は、切り出した部分文字列S1をfpでパーズし、当該パーズが正常に終了した場合にfpでパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_FP)として返し、且つ部分文字列S1のうちfpで処理されなかった残りの文字列を部分文字列str2として返す。ステップ1107を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した部分文字列 s3及びs4をFPでパーズし、当該パーズが正常に終了した場合にFPでパーズされた部分の文字列(s3)についてのパーズ結果を抽象構文木AST2として返し、且つ部分文字列sのうちFPで処理されなかった残りの文字列 s4を部分文字列として返す。
ステップ1108では、パーサー実行部(403)は、fpが部分文字列S1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_FPがエラーである場合には、fpでパーズ可能な部分文字列がまだ見つかっておらず、fpでパーズ可能な部分文字列を探すためにステップ1109に進む。一方、パーサー実行部(403)は、R_FPがエラーでない場合には、入力文字列にfpでパーズ可能な部分が見つかったのでステップ1110に進む。
ステップ1109では、パーサー実行部(403)は、変数xに1を加えて、文字列のポインタ位置を1ずらす。そして、当該処理はステップ1104に戻り、ステップ1104〜1108が繰り返される。
ステップ1110では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数xの位置の直前までの部分文字列を切り出し、当該切り出した部分文字列をS2に格納する。ステップ1110を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数3の位置の直前の変数2までの部分文字列s1及びs2を切り出し、当該切り出した部分文字列s1及びs2をS2に格納する。
ステップ1111では、パーサー実行部(403)は、切り出した文字列S2をnpでパーズし、当該パーズが正常に終了した場合にnpでパーズされた結果を抽象構文木(R_NP)として返し、且つ部分文字列S2のうちnpが処理しなかった残りの文字列を空の文字列εとして返す。npは文字列処理関数であるので空の文字列εがパーズ結果として返される。ステップ1111を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した文字列s1及びs2をNPでパーズし、当該パーズが正常に終了した場合にNPでパーズされた結果を抽象構文木AST1として返す。
ステップ1112では、パーサー実行部(403)は、ステップ1107からの抽象構文木(R_FP)とステップ1111からの抽象構文木(R_NP)とを例えばルートUで統合して、抽象構文木(R)を作成する。ステップ1112を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、ステップ907からの抽象構文木AST2とステップ911からの抽象構文木AST1とをルートUで統合して、抽象構文木ASTaを作成する。
ステップ1113では、パーサー実行部(403)は、ステップ1112からの抽象構文木(R)と部分文字列S1のうちfpが処理しなかった残りの文字列str2(ステップ1107から)とをパーズ結果として返す。
ステップ1114では、パーサー実行部(403)は、Until[np,fp]によるパーズ処理を終了する。
ステップ1102では、パーサー実行部(403)は、Until[np,fp]でパーズする入力文字列sを変数strに代入する。
ステップ1103では、パーサー実行部(403)は、文字列のポインタを示す変数xを初期化する。当該初期化によって、文字列のポインタは入力文字列の先頭をさすように設定される。
ステップ1104では、パーサー実行部(403)はstr.length()が変数xよりも大きい場合、すなわち入力文字列sの長さが文字列のポインタ位置よりも大きい場合に処理すべき文字列があることからステップ1105に進み、一方、変数xがstr.length()よりも大きい場合、すなわち入力文字列の長さが文字列のポインタ位置よりも小さい場合に処理すべき文字列がないことからステップ1106に進む。ステップ1104〜1109の各処理は、入力文字列sの先頭から末端までのそれぞれの入力文字列について繰り返し行われる。ステップ1106は、エラーを返すエラー処理である。
ステップ1105では、パーサー実行部(403)は、入力文字列sのうち、変数xの位置から最後の文字列までの部分文字列を切り出し、当該切り出した部分文字列をS1に格納する。
ステップ1107では、パーサー実行部(403)は、切り出した部分文字列S1をfpでパーズし、当該パーズが正常に終了した場合にfpでパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_FP)として返し、且つ部分文字列S1のうちfpで処理されなかった残りの文字列を部分文字列str2として返す。ステップ1107を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した部分文字列 s3及びs4をFPでパーズし、当該パーズが正常に終了した場合にFPでパーズされた部分の文字列(s3)についてのパーズ結果を抽象構文木AST2として返し、且つ部分文字列sのうちFPで処理されなかった残りの文字列 s4を部分文字列として返す。
ステップ1108では、パーサー実行部(403)は、fpが部分文字列S1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_FPがエラーである場合には、fpでパーズ可能な部分文字列がまだ見つかっておらず、fpでパーズ可能な部分文字列を探すためにステップ1109に進む。一方、パーサー実行部(403)は、R_FPがエラーでない場合には、入力文字列にfpでパーズ可能な部分が見つかったのでステップ1110に進む。
ステップ1109では、パーサー実行部(403)は、変数xに1を加えて、文字列のポインタ位置を1ずらす。そして、当該処理はステップ1104に戻り、ステップ1104〜1108が繰り返される。
ステップ1110では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数xの位置の直前までの部分文字列を切り出し、当該切り出した部分文字列をS2に格納する。ステップ1110を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、入力文字列sのうち、先頭文字列から変数3の位置の直前の変数2までの部分文字列s1及びs2を切り出し、当該切り出した部分文字列s1及びs2をS2に格納する。
ステップ1111では、パーサー実行部(403)は、切り出した文字列S2をnpでパーズし、当該パーズが正常に終了した場合にnpでパーズされた結果を抽象構文木(R_NP)として返し、且つ部分文字列S2のうちnpが処理しなかった残りの文字列を空の文字列εとして返す。npは文字列処理関数であるので空の文字列εがパーズ結果として返される。ステップ1111を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した文字列s1及びs2をNPでパーズし、当該パーズが正常に終了した場合にNPでパーズされた結果を抽象構文木AST1として返す。
ステップ1112では、パーサー実行部(403)は、ステップ1107からの抽象構文木(R_FP)とステップ1111からの抽象構文木(R_NP)とを例えばルートUで統合して、抽象構文木(R)を作成する。ステップ1112を図7aに従い説明すると、次の通りである:パーサー実行部(403)は、ステップ907からの抽象構文木AST2とステップ911からの抽象構文木AST1とをルートUで統合して、抽象構文木ASTaを作成する。
ステップ1113では、パーサー実行部(403)は、ステップ1112からの抽象構文木(R)と部分文字列S1のうちfpが処理しなかった残りの文字列str2(ステップ1107から)とをパーズ結果として返す。
ステップ1114では、パーサー実行部(403)は、Until[np,fp]によるパーズ処理を終了する。
図12は、図10に示すP = P1 F P2において、P1がNPであり且つP2がFPである場合(P= NP F FP)の処理関数For[np,fp]のパーズ動作を示すフローチャートを示す。
図12のフローチャートは、図7bの模式図で示されるパーズ動作に対応する。
図12のフローチャートで使用されている定義は、図11のフローチャートで使用されている定義と同じである。
図12のフローチャートは、図7bの模式図で示されるパーズ動作に対応する。
図12のフローチャートで使用されている定義は、図11のフローチャートで使用されている定義と同じである。
ステップ1201では、パーサー実行部(403)は、For[np,fp]で入力文字列(変数str)をパーズする処理を開始する。
ステップ1202では、パーサー実行部(403)は、For[np,fp]でパーズする入力文字列sを変数strに代入する。
ステップ1203では、パーサー実行部(403)は、文字列strをfpでパーズし、当該パーズが正常に終了した場合にfpでパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_FP)として返し(図示せず)、且つ入力文字列のうちfpが処理しなかった残りの文字列を部分文字列str1として返す。ステップ1203を図7bに従い説明すると、次の通りである:パーサー実行部(403)は、文字列s1s2をFPでパーズし、入力文字列のうちFPが処理しなかった残りの文字列s2を部分文字列str2として返す。
ステップ1204では、パーサー実行部(403)は、fpが部分文字列strを受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_FPがエラーでない場合には、入力文字列にまだfpで処理しうる部分がありうるのでステップ1205に進む。一方、パーサー実行部(403)は、R_FPがエラーである場合には、入力文字列にfpで処理しうる部分がないのでステップ1206に進む。ステップ1206は、エラーを返すエラー処理である。
ステップ1205では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から部分文字列str1の直前までの部分文字列を全体の入力文字列から差し引いた部分文字列str(0,str.length() - str1.length())を切り出し、当該切り出した部分文字列をS1に格納する。str(0,str.length() - str1.length())のうちのstr1はステップ1203のstr1と同じである。
ステップ1207では、パーサー実行部(403)は、切り出した文字列S1をnpでパーズし、当該パーズが正常に終了した場合にnpでパーズされた結果を抽象構文木(R_NP)として返し、且つ部分文字列S1のうちnpが処理しなかった残りの文字列を空の文字列εとして返す。ステップ1207を図7bに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した文字列s1をNでパーズし、当該パーズが正常に終了した場合に抽象構文木ASTb をパーズ結果として返す。なお、図7bの場合、Nのパーズ結果の一部として返される文字列は空の文字列である。
ステップ1208では、パーサー実行部(403)は、ステップ1203からの抽象構文木(R_FP)とステップ1206からの抽象構文木(R_NP)とをルートFで統合して、抽象構文木(R)を作成する。なお、抽象構文木(R)を作成せずに、ステップ1206からの抽象構文木(R_NP)と、ステップ1203でfpが処理しなかった残りの文字列str1とを返すようにしてもよい。
ステップ1209では、パーサー実行部(403)は、ステップ1208からの抽象構文木(R)と、ステップ1203で部分文字列S1のうちfpが処理しなかった残りの文字列str1とを返す。
ステップ1210では、パーサー実行部(403)は、For[np,fp] によるパーズ処理を終了する。
ステップ1202では、パーサー実行部(403)は、For[np,fp]でパーズする入力文字列sを変数strに代入する。
ステップ1203では、パーサー実行部(403)は、文字列strをfpでパーズし、当該パーズが正常に終了した場合にfpでパーズされた部分の文字列についてのパーズ結果を抽象構文木(R_FP)として返し(図示せず)、且つ入力文字列のうちfpが処理しなかった残りの文字列を部分文字列str1として返す。ステップ1203を図7bに従い説明すると、次の通りである:パーサー実行部(403)は、文字列s1s2をFPでパーズし、入力文字列のうちFPが処理しなかった残りの文字列s2を部分文字列str2として返す。
ステップ1204では、パーサー実行部(403)は、fpが部分文字列strを受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R_FPがエラーでない場合には、入力文字列にまだfpで処理しうる部分がありうるのでステップ1205に進む。一方、パーサー実行部(403)は、R_FPがエラーである場合には、入力文字列にfpで処理しうる部分がないのでステップ1206に進む。ステップ1206は、エラーを返すエラー処理である。
ステップ1205では、パーサー実行部(403)は、入力文字列sのうち、先頭文字列から部分文字列str1の直前までの部分文字列を全体の入力文字列から差し引いた部分文字列str(0,str.length() - str1.length())を切り出し、当該切り出した部分文字列をS1に格納する。str(0,str.length() - str1.length())のうちのstr1はステップ1203のstr1と同じである。
ステップ1207では、パーサー実行部(403)は、切り出した文字列S1をnpでパーズし、当該パーズが正常に終了した場合にnpでパーズされた結果を抽象構文木(R_NP)として返し、且つ部分文字列S1のうちnpが処理しなかった残りの文字列を空の文字列εとして返す。ステップ1207を図7bに従い説明すると、次の通りである:パーサー実行部(403)は、切り出した文字列s1をNでパーズし、当該パーズが正常に終了した場合に抽象構文木ASTb をパーズ結果として返す。なお、図7bの場合、Nのパーズ結果の一部として返される文字列は空の文字列である。
ステップ1208では、パーサー実行部(403)は、ステップ1203からの抽象構文木(R_FP)とステップ1206からの抽象構文木(R_NP)とをルートFで統合して、抽象構文木(R)を作成する。なお、抽象構文木(R)を作成せずに、ステップ1206からの抽象構文木(R_NP)と、ステップ1203でfpが処理しなかった残りの文字列str1とを返すようにしてもよい。
ステップ1209では、パーサー実行部(403)は、ステップ1208からの抽象構文木(R)と、ステップ1203で部分文字列S1のうちfpが処理しなかった残りの文字列str1とを返す。
ステップ1210では、パーサー実行部(403)は、For[np,fp] によるパーズ処理を終了する。
図13は、図8に記載の本発明の実施態様に従い生成された組み合わせパーサーを使用して、入力テキストから情報を抽出する例を示す。
固有(Result-And-Conditions Pattern)の記法は例えば、あるWebシステムの画面仕様書において、画面上の項目値の設定を記述するために使用される。1301は、固有の記法に従ったテキストの例を2つ示す。
テキスト1302及びテキスト1303は、全体の構造(但し、下線部を除く)が固有の記法に従って記載されている。すなわち、テキスト1302は、「次のすべてが成り立つ場合、」という形式的な記述を有し、その次に個々の中身の自由度が高い記述を有する。また、テキスト1303は、「以下の全てが成り立つ場合、」という形式的な記述を有し、その次に個々の中身の自由度が高い記述を有する。
ユーザは、このテキストを下記のようにパーズしたいと考える:
(1)テキストの全体の構造(但し、下線部を除く)が固有の記法に従っているかどうかについて検査できるようにしたい:及び
(2)テキストの特定部分(テキスト1302及びテキスト1303の下線部分)のみに、特定の自然言語処理is-a-NLPを適用し、is-a関係のペアを抽出できるようにしたい。
そこで、ユーザは、第1のエディタ部(302)を使用して、文法記述の組み合わせパターンを含む宣言的記述(1304)を作成する。文法記述の組み合わせ1304では、文法記述のルールP1 U P2(すなわち、FP U NP)が使用されている。また、文法記述の組み合わせ1304では、[is-a-NLP]が、is-a-NLPパーサー名を指定し、そして当該is-a-NLPパーサーの適用箇所を示す。(次のすべてが成り立つ場合/以下のすべてが成り立つ場合)の「/」は、優先順位が付いた“又は”を意味し、「次のすべてが成り立つ場合」でパーズし、パーズ出来なければ「以下のすべてが成り立つ場合」でパーズすることを意味する。また、文法記述の組み合わせ1304において、+は、[is-a-NLP]U<改行>の1回以上の繰り返しを示す。
宣言的記述が、第1のエディタ部(302)からパーサー生成装置(1305)に渡される。パーサー生成装置(1305、図3の301に対応する)は、宣言的記述(1304)中の文法記述の組み合わせパターンに従い組み合わせパーサー(コード)(1306)を自動的に生成する。コンパイラ−(402)は、生成された組み合わせパーサー(コード)(1306)をその実行コードに変換する。
1307は、テキスト1302及びテキスト1302を上記実行コードでパーズした結果を示す。組み合わせパーサーは、固有の記法を持つテキストを次のようにパーズすることが可能である:(1)全体のテキスト構造(但し、下線部分を除く)が、固有の記法に従っていることを検査するためにパーズする;(2)テキストの特定部分(下線部分である)にのみ、特定の自然言語処理(is-a-NLP)を適用し、is-a関係のペアを抽出するためにパーズする。
パーズの結果は、1307に示すようなテキスト形式(例えばXML形式)、又は当該テキスト形式に対応する抽象構文木(AST)で示されうる。パーズの結果をどのような手法で表現するかは、当業者に知られている方法を任意に使用することが可能である。
固有(Result-And-Conditions Pattern)の記法は例えば、あるWebシステムの画面仕様書において、画面上の項目値の設定を記述するために使用される。1301は、固有の記法に従ったテキストの例を2つ示す。
テキスト1302及びテキスト1303は、全体の構造(但し、下線部を除く)が固有の記法に従って記載されている。すなわち、テキスト1302は、「次のすべてが成り立つ場合、」という形式的な記述を有し、その次に個々の中身の自由度が高い記述を有する。また、テキスト1303は、「以下の全てが成り立つ場合、」という形式的な記述を有し、その次に個々の中身の自由度が高い記述を有する。
ユーザは、このテキストを下記のようにパーズしたいと考える:
(1)テキストの全体の構造(但し、下線部を除く)が固有の記法に従っているかどうかについて検査できるようにしたい:及び
(2)テキストの特定部分(テキスト1302及びテキスト1303の下線部分)のみに、特定の自然言語処理is-a-NLPを適用し、is-a関係のペアを抽出できるようにしたい。
そこで、ユーザは、第1のエディタ部(302)を使用して、文法記述の組み合わせパターンを含む宣言的記述(1304)を作成する。文法記述の組み合わせ1304では、文法記述のルールP1 U P2(すなわち、FP U NP)が使用されている。また、文法記述の組み合わせ1304では、[is-a-NLP]が、is-a-NLPパーサー名を指定し、そして当該is-a-NLPパーサーの適用箇所を示す。(次のすべてが成り立つ場合/以下のすべてが成り立つ場合)の「/」は、優先順位が付いた“又は”を意味し、「次のすべてが成り立つ場合」でパーズし、パーズ出来なければ「以下のすべてが成り立つ場合」でパーズすることを意味する。また、文法記述の組み合わせ1304において、+は、[is-a-NLP]U<改行>の1回以上の繰り返しを示す。
宣言的記述が、第1のエディタ部(302)からパーサー生成装置(1305)に渡される。パーサー生成装置(1305、図3の301に対応する)は、宣言的記述(1304)中の文法記述の組み合わせパターンに従い組み合わせパーサー(コード)(1306)を自動的に生成する。コンパイラ−(402)は、生成された組み合わせパーサー(コード)(1306)をその実行コードに変換する。
1307は、テキスト1302及びテキスト1302を上記実行コードでパーズした結果を示す。組み合わせパーサーは、固有の記法を持つテキストを次のようにパーズすることが可能である:(1)全体のテキスト構造(但し、下線部分を除く)が、固有の記法に従っていることを検査するためにパーズする;(2)テキストの特定部分(下線部分である)にのみ、特定の自然言語処理(is-a-NLP)を適用し、is-a関係のペアを抽出するためにパーズする。
パーズの結果は、1307に示すようなテキスト形式(例えばXML形式)、又は当該テキスト形式に対応する抽象構文木(AST)で示されうる。パーズの結果をどのような手法で表現するかは、当業者に知られている方法を任意に使用することが可能である。
図14は、図13の1301に示す例のために、ユーザによって作成される文法記述例を示す。
宣言的記述1401は、複数の文法記述を含む。文法記述は、図6の記載に従う。
図14に示す宣言的記述において、文法記述のトップレベルでの組み合わせは、S :: = P1 ; P2である。
トップレベルにある文法記述のP1はさらに、P12 / P13の文法記述からなる(第1のサブレベル)。
サブレベルにある文法記述のP12は形式言語部分の特定であり、「次のすべてが成り立つ場合」によって特定されている。
サブレベルにある文法記述のP13は形式言語部分の特定であり、「以下のすべてが成り立つ場合」によって特定されている。
トップレベルにある文法記述のP2はさらに、P3 ; P4の文法記述からなる(第1のサブレベル)。
サブレベルにある文法記述のP3は形式言語部分の特定であり、「、」(「場合」という語に続いている文字である)によって特定されている。
サブレベルにある文法記述のP4はさらに、P5 ; P6の文法記述からなる(第2のサブレベル)。
サブレベルにある文法記述のP5はさらに、Pn U P8の文法記述からなる(第3のサブレベル)。
サブレベルにある文法記述のP6はさらに、P7 ; P7*の文法記述からなる(第3のサブレベル)。
文法記述Pnは、自然言語処理関数[is-a-NLP]を指定する。
文法記述P8は、改行を指定する。
文法記述P7は、Pn U P8の文法記述からなる(第4のサブレベル)。
以上のように、宣言的記述は、図6に示す文法記述に従っており、トップレベルからサブレベルまで順次分解されてその文法記述が特定される。
宣言的記述1401は、複数の文法記述を含む。文法記述は、図6の記載に従う。
図14に示す宣言的記述において、文法記述のトップレベルでの組み合わせは、S :: = P1 ; P2である。
トップレベルにある文法記述のP1はさらに、P12 / P13の文法記述からなる(第1のサブレベル)。
サブレベルにある文法記述のP12は形式言語部分の特定であり、「次のすべてが成り立つ場合」によって特定されている。
サブレベルにある文法記述のP13は形式言語部分の特定であり、「以下のすべてが成り立つ場合」によって特定されている。
トップレベルにある文法記述のP2はさらに、P3 ; P4の文法記述からなる(第1のサブレベル)。
サブレベルにある文法記述のP3は形式言語部分の特定であり、「、」(「場合」という語に続いている文字である)によって特定されている。
サブレベルにある文法記述のP4はさらに、P5 ; P6の文法記述からなる(第2のサブレベル)。
サブレベルにある文法記述のP5はさらに、Pn U P8の文法記述からなる(第3のサブレベル)。
サブレベルにある文法記述のP6はさらに、P7 ; P7*の文法記述からなる(第3のサブレベル)。
文法記述Pnは、自然言語処理関数[is-a-NLP]を指定する。
文法記述P8は、改行を指定する。
文法記述P7は、Pn U P8の文法記述からなる(第4のサブレベル)。
以上のように、宣言的記述は、図6に示す文法記述に従っており、トップレベルからサブレベルまで順次分解されてその文法記述が特定される。
図15は、図13に示す文法記述(1304)の例において生成される組み合わせパーサー(1305)のパーズ動作を示すフローチャートを示す。
ステップ1501では、パーサー実行部(403)は、組み合わせパーサーで図13に示すテキスト(1302、1303)をパーズする処理を開始する。
ステップ1502〜1506は、図13の1304の(次のすべてが成り立つ場合/以下のすべてが成り立つ場合) 部分をパーズする処理を示す。
ステップ1502では、パーサー実行部(403)は、文字列“次のすべてが成り立つ場合、”を変数str1に格納する。
ステップ1503では、パーサー実行部(403)は、文字列“以下のすべてが成り立つ場合、”を変数str2に格納する。
ステップ1504では、パーサー実行部(403)は、パーサー(str1/str2)で文字列sをパーズする。Or(str1,str2,s)は、パーサー(sr1/str2)で文字列sをパーズする処理を表す。パーサー実行部(403)は、文字列sの先頭文字列がstr1であるか又はstr2であるかをチェックする。先頭文字列がstr1である場合に、パーサー実行部(403)は、str1部分の抽象構文木Rhと、文字列sの先頭文字列からstr1を除いた文字列とをパーズ結果として返す。先頭文字列がstr2である場合に、パーサー実行部(403)は、str2部分の抽象構文木Rhと、文字列sの先頭文字列からstr2を除いた文字列とをパーズ結果として返す。
ステップ1505では、パーサー実行部(403)は、ステップ1504で返された結果を調べるために、パーサー(str1/str2)が文字列sを受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、Rhがエラーでない場合には、ステップ1504で返された結果から抽象構文木と残りの文字列とを取出すために、ステップ1506に進む。一方、パーサー実行部(403)は、Rhがエラーである場合には、パーズ・エラーとなるために、ステップ1507に進む。ステップ1507はエラー処理である。
ステップ1506では、パーサー実行部(403)は、ステップ1504で返された結果から、抽象構文木Ah1と残りの文字列str1を取り出している。なお、ステップ1506は、ステップ1504の結果を取り出しているだけなので省略してもよい。
ステップ1508では、パーサー実行部(403)は、is-a-NLPの名前を持つ自然言語処理関数を自然言語処理登録ストア(305)から取り出す。パーサー実行部(403)は、当該取り出した自然言語処理関数を、関数npに格納する。
ステップ1509では、パーサー実行部(403)は、改行文字列のみを受理するパーサー関数を生成し、関数retに格納する。
ステップ1510では、パーサー実行部(403)は、ステップ1506からの部分文字列sr1をUntil[np,ret]でパーズし、抽象構文木R2をパーズ結果として返す。
ステップ1511では、パーサー実行部(403)は、パーサーretが部分文字列sr1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R2がエラーである場合には、全体としての結果がパーズ・エラーとなるのでステップ1507に進む。一方、パーサー実行部(403)は、R2がエラーでない場合には、この部分のパーズが成功しているので次のパーズに進むためにステップ1512に進む。
ステップ1512では、パーサー実行部(403)は、ステップ1510の結果から抽象構文木Ah2及びsr2を取り出して、ステップ1513へ進む。
ステップ1513では、パーサー実行部(403)は、変数srに格納されている文字列を変数sに格納しなおす。また、パーサー実行部(403)は、ステップ1506からの抽象構文木(Ah1)とステップ1512からの抽象構文木(Ah2)とをルートseqで統合して、抽象構文木(Ah)を作成する。
ステップ1514〜1518は、図13の1304の (・[is-a-NLP]U <改行>)+ 部分をパーズする処理を示す。
ステップ1514では、パーサー実行部(403)は、パーズした・[is-a-NLP] U <改行> の個数を保持している変数iを初期化する。
ステップ1515では、パーサー実行部(403)は、ステップ1513からの部分文字列sをUntil[np,ret]でパーズし、抽象構文木Rをパーズ結果として返す。
ステップ1516では、パーサー実行部(403)は、Util[np,ret]が文字列sをパーズできるかどうかを判定する。パーサー実行部(403)は、Rがエラーである場合には、全体としての結果がパーズ・エラーとなるのでステップ1507に進む。一方、パーサー実行部(403)は、Rがエラーでない場合には、この部分のパーズが成功しているので次のパーズに進むためにステップ1517に進む。
ステップ1517では、パーサー実行部(403)は、変数iに1を加える。また、パーサー実行部(403)は、ステップ1515のパーズ結果Rから抽象構文木Aiと残りの文字列sとをパーズ結果として返す。
ステップ1518では、パーサー実行部(403)は、sが空白文字のみであるかどうかを判定する。パーサー実行部(403)は、sが空白文字のみでない場合にステップ1515に戻り、一方、sが空白文字である場合にステップ1519に進む。
ステップ1519では、パーサー実行部(403)は、ステップ1517からの各A1,…,Aiを子ノードとし、ルートrepで統合して、抽象構文木(Ac)を作成する。また、パーサー実行部(403)は、ステップ1513からの抽象構文木(Ah)とステップ1519からの抽象構文木(Ac)とを子ノードとし、ルートseqで統合して、抽象構文木(AR)を作成する。
ステップ1520では、パーサー実行部(403)は、パーズが成功である場合に、ステップ1519からの抽象構文木(AR)をパーズ結果として返す。
ステップ1521では、パーサー実行部(403)は、組み合わせパーサーのパーズ処理を終了する。
ステップ1501では、パーサー実行部(403)は、組み合わせパーサーで図13に示すテキスト(1302、1303)をパーズする処理を開始する。
ステップ1502〜1506は、図13の1304の(次のすべてが成り立つ場合/以下のすべてが成り立つ場合) 部分をパーズする処理を示す。
ステップ1502では、パーサー実行部(403)は、文字列“次のすべてが成り立つ場合、”を変数str1に格納する。
ステップ1503では、パーサー実行部(403)は、文字列“以下のすべてが成り立つ場合、”を変数str2に格納する。
ステップ1504では、パーサー実行部(403)は、パーサー(str1/str2)で文字列sをパーズする。Or(str1,str2,s)は、パーサー(sr1/str2)で文字列sをパーズする処理を表す。パーサー実行部(403)は、文字列sの先頭文字列がstr1であるか又はstr2であるかをチェックする。先頭文字列がstr1である場合に、パーサー実行部(403)は、str1部分の抽象構文木Rhと、文字列sの先頭文字列からstr1を除いた文字列とをパーズ結果として返す。先頭文字列がstr2である場合に、パーサー実行部(403)は、str2部分の抽象構文木Rhと、文字列sの先頭文字列からstr2を除いた文字列とをパーズ結果として返す。
ステップ1505では、パーサー実行部(403)は、ステップ1504で返された結果を調べるために、パーサー(str1/str2)が文字列sを受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、Rhがエラーでない場合には、ステップ1504で返された結果から抽象構文木と残りの文字列とを取出すために、ステップ1506に進む。一方、パーサー実行部(403)は、Rhがエラーである場合には、パーズ・エラーとなるために、ステップ1507に進む。ステップ1507はエラー処理である。
ステップ1506では、パーサー実行部(403)は、ステップ1504で返された結果から、抽象構文木Ah1と残りの文字列str1を取り出している。なお、ステップ1506は、ステップ1504の結果を取り出しているだけなので省略してもよい。
ステップ1508では、パーサー実行部(403)は、is-a-NLPの名前を持つ自然言語処理関数を自然言語処理登録ストア(305)から取り出す。パーサー実行部(403)は、当該取り出した自然言語処理関数を、関数npに格納する。
ステップ1509では、パーサー実行部(403)は、改行文字列のみを受理するパーサー関数を生成し、関数retに格納する。
ステップ1510では、パーサー実行部(403)は、ステップ1506からの部分文字列sr1をUntil[np,ret]でパーズし、抽象構文木R2をパーズ結果として返す。
ステップ1511では、パーサー実行部(403)は、パーサーretが部分文字列sr1を受理出来ないものであるかどうかを判定する。パーサー実行部(403)は、R2がエラーである場合には、全体としての結果がパーズ・エラーとなるのでステップ1507に進む。一方、パーサー実行部(403)は、R2がエラーでない場合には、この部分のパーズが成功しているので次のパーズに進むためにステップ1512に進む。
ステップ1512では、パーサー実行部(403)は、ステップ1510の結果から抽象構文木Ah2及びsr2を取り出して、ステップ1513へ進む。
ステップ1513では、パーサー実行部(403)は、変数srに格納されている文字列を変数sに格納しなおす。また、パーサー実行部(403)は、ステップ1506からの抽象構文木(Ah1)とステップ1512からの抽象構文木(Ah2)とをルートseqで統合して、抽象構文木(Ah)を作成する。
ステップ1514〜1518は、図13の1304の (・[is-a-NLP]U <改行>)+ 部分をパーズする処理を示す。
ステップ1514では、パーサー実行部(403)は、パーズした・[is-a-NLP] U <改行> の個数を保持している変数iを初期化する。
ステップ1515では、パーサー実行部(403)は、ステップ1513からの部分文字列sをUntil[np,ret]でパーズし、抽象構文木Rをパーズ結果として返す。
ステップ1516では、パーサー実行部(403)は、Util[np,ret]が文字列sをパーズできるかどうかを判定する。パーサー実行部(403)は、Rがエラーである場合には、全体としての結果がパーズ・エラーとなるのでステップ1507に進む。一方、パーサー実行部(403)は、Rがエラーでない場合には、この部分のパーズが成功しているので次のパーズに進むためにステップ1517に進む。
ステップ1517では、パーサー実行部(403)は、変数iに1を加える。また、パーサー実行部(403)は、ステップ1515のパーズ結果Rから抽象構文木Aiと残りの文字列sとをパーズ結果として返す。
ステップ1518では、パーサー実行部(403)は、sが空白文字のみであるかどうかを判定する。パーサー実行部(403)は、sが空白文字のみでない場合にステップ1515に戻り、一方、sが空白文字である場合にステップ1519に進む。
ステップ1519では、パーサー実行部(403)は、ステップ1517からの各A1,…,Aiを子ノードとし、ルートrepで統合して、抽象構文木(Ac)を作成する。また、パーサー実行部(403)は、ステップ1513からの抽象構文木(Ah)とステップ1519からの抽象構文木(Ac)とを子ノードとし、ルートseqで統合して、抽象構文木(AR)を作成する。
ステップ1520では、パーサー実行部(403)は、パーズが成功である場合に、ステップ1519からの抽象構文木(AR)をパーズ結果として返す。
ステップ1521では、パーサー実行部(403)は、組み合わせパーサーのパーズ処理を終了する。
図16は、図15に示すフローチャートのステップ1504におけるサブルーチンのフローチャートを示す。
ステップ1601では、パーサー実行部(403)は、Or(str1,str2,s)の処理を開始する。
ステップ1602では、パーサー実行部(403)は、str1がsの前方部分文字列であるかどうかを検査する。str1がsの前方部分文字列でない場合にステップ1603に進み、一方、str1がsの前方部分文字列である場合にステップ1604に進む。
ステップ1604では、パーサー実行部(403)は、str1がsの前方部分文字列である場合にstr1をstrに格納する。
ステップ1603では、パーサー実行部(403)は、str2がsの前方部分文字列でない場合にステップ1605に進み、一方、str2がsの前方部分文字列である場合にステップ1606に進む。
ステップ1606では、パーサー実行部(403)は、str2がsの前方部分文字列である場合にstr2をstrに格納する。
ステップ1605では、パーサー実行部(403)は、str2がsの前方部分文字列でないことに応じて、エラー処理をし、ステップ1610に進む。
ステップ1607では、パーサー実行部(403)は、sから前方部分文字列strを除いた部分文字列をs’に格納する。
ステップ1608では、パーサー実行部(403)は、前方部分文字列strの構文木Aを作成する。
ステップ1609では、パーサー実行部(403)は、ステップ1608からの構文木Aとステップ1607からの文字列s’を返す。文字列s’は、その後、図15のステップ1506において、sr1に代入される。
ステップ1610では、パーサー実行部(403)は、Or(str1,str2,s)の処理を終了する。
ステップ1601では、パーサー実行部(403)は、Or(str1,str2,s)の処理を開始する。
ステップ1602では、パーサー実行部(403)は、str1がsの前方部分文字列であるかどうかを検査する。str1がsの前方部分文字列でない場合にステップ1603に進み、一方、str1がsの前方部分文字列である場合にステップ1604に進む。
ステップ1604では、パーサー実行部(403)は、str1がsの前方部分文字列である場合にstr1をstrに格納する。
ステップ1603では、パーサー実行部(403)は、str2がsの前方部分文字列でない場合にステップ1605に進み、一方、str2がsの前方部分文字列である場合にステップ1606に進む。
ステップ1606では、パーサー実行部(403)は、str2がsの前方部分文字列である場合にstr2をstrに格納する。
ステップ1605では、パーサー実行部(403)は、str2がsの前方部分文字列でないことに応じて、エラー処理をし、ステップ1610に進む。
ステップ1607では、パーサー実行部(403)は、sから前方部分文字列strを除いた部分文字列をs’に格納する。
ステップ1608では、パーサー実行部(403)は、前方部分文字列strの構文木Aを作成する。
ステップ1609では、パーサー実行部(403)は、ステップ1608からの構文木Aとステップ1607からの文字列s’を返す。文字列s’は、その後、図15のステップ1506において、sr1に代入される。
ステップ1610では、パーサー実行部(403)は、Or(str1,str2,s)の処理を終了する。
実施例1
図17は、本発明の実施態様に従う組み合わせパーサーでテストケース記述データをパーズし、パラメータ名と値(Value)とを取り出し、組み合わせテストの最適化を行う例を示す。
組み合わせテストとは、可能性のあるパラメータ名と値との組み合わせを全てテストすることである。実施例1では、どのパラメータがどの値を取り得るのかをドキュメント(テストケース記述のデータ)から収集することを目的としている。
表1701は、テストケース記述のデータ例を示す。テストケース記述は192個用意された(1701−1、1701−2、1701−3、・・・、1701−192)。各テストケース記述は、類似のデータ構造を有する。
ユーザは、本発明の実施態様に従う、複数の文法記述を含む宣言的記述を下記の通り作成した。作成された宣言的記述は、自然言語処理関数と形式言語処理パーサーとの組み合わせ適用を示す文法記述を含む。当該宣言的記述において、文法記述のトップレベルは「;」である。
図17は、本発明の実施態様に従う組み合わせパーサーでテストケース記述データをパーズし、パラメータ名と値(Value)とを取り出し、組み合わせテストの最適化を行う例を示す。
組み合わせテストとは、可能性のあるパラメータ名と値との組み合わせを全てテストすることである。実施例1では、どのパラメータがどの値を取り得るのかをドキュメント(テストケース記述のデータ)から収集することを目的としている。
表1701は、テストケース記述のデータ例を示す。テストケース記述は192個用意された(1701−1、1701−2、1701−3、・・・、1701−192)。各テストケース記述は、類似のデータ構造を有する。
ユーザは、本発明の実施態様に従う、複数の文法記述を含む宣言的記述を下記の通り作成した。作成された宣言的記述は、自然言語処理関数と形式言語処理パーサーとの組み合わせ適用を示す文法記述を含む。当該宣言的記述において、文法記述のトップレベルは「;」である。
(複数の文法記述の組み合わせ)
S ::= [(For keyword-NLP)?] U (validate/Validate that);[is-a-NLP]U eoi
S ::= [(For keyword-NLP)?] U (validate/Validate that);[is-a-NLP]U eoi
複数の文法記述の組み合わせSは、形式言語処理「For」の後ろに自然言語処理「keyword-NLP」を含み、そして形式言語処理「validate」及び「validate that」を含み、さらにその後ろに自然言語処理「is-a-NLP」を適用することを記述する。当該文法記述の組み合わせSにおいて、テストケース記述に関する知見に基づき、必要な箇所に必要なNLPが適用されている。
そして、当該文法記述の組み合わせSから、本発明の実施態様に従う組み合わせパーサー(コード)sが生成され、そして当該組み合わせパーサー(コード)sがコンパイラによって実行コードに変換された。
そして、当該文法記述の組み合わせSから、本発明の実施態様に従う組み合わせパーサー(コード)sが生成され、そして当該組み合わせパーサー(コード)sがコンパイラによって実行コードに変換された。
各テストケース記述(1701−1、1701−2、1701−3、・・・、1701−192)を上記実行コードでパーズした(1702)。当該パーズにより、テストケース記述の特定の文脈からのみ、パラメータ名と値を抽出可能である。それによって、テストで用いるパラメータを示す値を収集できる。その結果、パラメータ名と値の対が92個得られた。収集した値を当該値中の最後の単語でソートした結果が表1703である。表1703をみることで、組み合わせテストのためのパラメータ−値が定義しやすくなる。表1701と表1703との間には、各テストケース記述からパラメータと値とがどのように抽出されたかを示す点線矢印が記載されている。そして、表1703において、パラメータ値が同じものの値について、表1704が新たに作成された。表1704は、組み合わせテスト最適化の入力例を示す。
各テストケース記述(1701−1、1701−2、1701−3、・・・、1701−192)を従来技術に従うパーサーを適用してキーワードを抽出した(1705)。従来技術は、テストケース記述全体に対して、is-a-NLP(is-a関係を取り出す処理関数である)及びkeyword-NLP(特定のキーワードを取り出す処理関数である)を適用する方法である。その結果、パラメータ名と値の対が415個得られた(1706)。そして、パラメータ値が同じものの値について、表1704が新たに作成された。
本発明の実施態様に従い作成された組み合わせパーサーを適用した場合、既存のパーサーを使用するように文法記述を記述可能である。そのために、言語処理パーサーを抽出目的によってカスタマイズする必要がない。一方、既存の技術では、言語処理パーサーを抽出目的によってカスタマイズする必要がある。従って、本発明の実施態様に従い作成された組み合わせパーサーを使用することで、言語処理パーサーをカスタマイズするコストを軽減ないしは削減することが可能である。
また、本発明の実施態様に従い作成された組み合わせパーサーを適用した場合、既存のパーサーを適用した場合に比べて、抽出されたキーワードの数が少ない。従って、抽出されたキーワードから、表1704を作成するコストを軽減ないしは削減することが可能である。また、本発明の実施態様に従い作成された組み合わせパーサーを適用した場合、必要な情報を含んだ状態で対象を絞り込むことが可能であり、モデル作成の作業を軽減することが可能である。
また、本発明の実施態様に従い作成された組み合わせパーサーを適用した場合、既存のパーサーを適用した場合に比べて、抽出されたキーワードの数が少ない。従って、抽出されたキーワードから、表1704を作成するコストを軽減ないしは削減することが可能である。また、本発明の実施態様に従い作成された組み合わせパーサーを適用した場合、必要な情報を含んだ状態で対象を絞り込むことが可能であり、モデル作成の作業を軽減することが可能である。
実施例2
図18は、本発明の実施態様に従い、特定の部分のみをパーズすることを可能にすることを示すための画面仕様書の例を示す。なお、以下では、隅付き括弧を[]で示す。
画面仕様書1801は、XML形式で記載されている。そして、ユーザは、画面仕様書1801のうち、隅付き括弧内に[項目表示処理]で示される1802で示す部分のみをパーズしたいと考える。1802で示される部分のみのパーズ結果を有する抽象構文木を返すパーサー<item-process>は、下記のように記述される。
図18は、本発明の実施態様に従い、特定の部分のみをパーズすることを可能にすることを示すための画面仕様書の例を示す。なお、以下では、隅付き括弧を[]で示す。
画面仕様書1801は、XML形式で記載されている。そして、ユーザは、画面仕様書1801のうち、隅付き括弧内に[項目表示処理]で示される1802で示す部分のみをパーズしたいと考える。1802で示される部分のみのパーズ結果を有する抽象構文木を返すパーサー<item-process>は、下記のように記述される。
<item-process>::= {◇[項目表示処理]}; FD ; {[画面遷移処理]}
但し、パーサー◇FPは、(ε U FP)であり、
パーサー{FP}は、(ε F FP)であり、
パーサーFDは、1802の部分をパーズする形式言語処理パーサーである。
◇FPは、FPが成功する部分(すなわち、[項目表示処理])までを無視して捨て、当該成功する部分をFPでパーズする、という文法記述である。上記例において◇FPは[項目表示処理]である。
パーサー{FP}は、FPでパーズして、パーズ結果であるASTを捨てる、という文法記述である。上記例において{FP}は[画面遷移処理]である。従って、{[画面遷移処理]}では、パーサー{FP}は、パーズ結果の[画面遷移処理]部分のASTを捨てる。
但し、パーサー◇FPは、(ε U FP)であり、
パーサー{FP}は、(ε F FP)であり、
パーサーFDは、1802の部分をパーズする形式言語処理パーサーである。
◇FPは、FPが成功する部分(すなわち、[項目表示処理])までを無視して捨て、当該成功する部分をFPでパーズする、という文法記述である。上記例において◇FPは[項目表示処理]である。
パーサー{FP}は、FPでパーズして、パーズ結果であるASTを捨てる、という文法記述である。上記例において{FP}は[画面遷移処理]である。従って、{[画面遷移処理]}では、パーサー{FP}は、パーズ結果の[画面遷移処理]部分のASTを捨てる。
上記に説明したように、本発明の実施態様では、テキストの特定部分のみをパーズし、抽象構文木として抽出することが可能である。
なお、従来の文法記述では、テキスト全体がパーズの処理対象であるためにテキストの特定部分のみをパーズして抽象構文木として抽出することが出来ず、従って、パーズ結果を別途のプログラムで処理して特定部分のみの抽象構文木を作成する必要がある。
なお、従来の文法記述では、テキスト全体がパーズの処理対象であるためにテキストの特定部分のみをパーズして抽象構文木として抽出することが出来ず、従って、パーズ結果を別途のプログラムで処理して特定部分のみの抽象構文木を作成する必要がある。
図18に示す本発明の実施態様は、テキストが例えば、XML文書、特許、意匠、又は商標出願文書においても適用可能である。
実施例3
図19は、本発明の実施態様に従い、あるプロジェクトにおいて、特定の設計文書中の特定の記述部分についてパーズした場合を説明するための表を示す。
図19はあるプロジェクトの特定の設計文書である画面仕様書の項目表示処理部分の記法に対する文法を示す。なお、実例の記載は省略している。
記法中、Bの部分を自然言語処理で解析し、可能であれば(条件、結果)のペアを得たいとする。
記法中、C及びRの部分を自然言語処理で解析し、可能であれば(項目、値)のペアを得たいとする。
図19は、本発明の実施態様に従い、あるプロジェクトにおいて、特定の設計文書中の特定の記述部分についてパーズした場合を説明するための表を示す。
図19はあるプロジェクトの特定の設計文書である画面仕様書の項目表示処理部分の記法に対する文法を示す。なお、実例の記載は省略している。
記法中、Bの部分を自然言語処理で解析し、可能であれば(条件、結果)のペアを得たいとする。
記法中、C及びRの部分を自然言語処理で解析し、可能であれば(項目、値)のペアを得たいとする。
記法中、B、C及びRの部分を全て形式的に書き下す場合、そのプログラミングは大変である。そこで、既存の自然言語処理を本発明の実施態様に従い適用可能とするために、本発明の実施態様に従う文法記述を使用し、宣言的記述を作成した。そして、作成された宣言的記述から、自動的に組み合わせパーサーを生成した。
図19に示す設計文書を、上記組み合わせパーサーでパーズしたところ、画面仕様書に対して、必要なパターン数が20数個に抑えることができた。また、PEGで処理しない部分に自然言語処理関数を適用するために、抽象構文木処理のためのプログラムを個別に作り込む必要がない。
図19に示す設計文書を、上記組み合わせパーサーでパーズしたところ、画面仕様書に対して、必要なパターン数が20数個に抑えることができた。また、PEGで処理しない部分に自然言語処理関数を適用するために、抽象構文木処理のためのプログラムを個別に作り込む必要がない。
(比較例)
記法中、B、C及びRの部分を全て形式的に書き下す場合、書き下すパターンの数が約50〜60個であった(但し、該当部分の自然文として妥当な全てのパターンをカバーしているものではない)。
また、自然言語処理関数を利用する場合においても、既存のPEGに従う方法では、書き下す抽出パターンは約20個であった。ただし、自然言語処理関数を利用する場合、そのパーズ結果の抽象構文木の処理のためのプログラミングが別途必要であり、さらに当該プログラミングは抽出パターンごとに必要であった。抽象構文木の処理は、ツリーマッチング等による必要部分の抽出、及び必要部分への自然言語処理を含む。
このように、従来技術による方法では、自然文を含むテキストを全て形式的に書き下すことは労力を必要とし、また設計ごとに記法が異なったり、又は設計文書若しくは要求文書で使われる独自記法又はテンプレートなどの形式的な部分の記法の変更が頻繁に生じたりするので、パターン以外の部分を作り込むことが難しい。
記法中、B、C及びRの部分を全て形式的に書き下す場合、書き下すパターンの数が約50〜60個であった(但し、該当部分の自然文として妥当な全てのパターンをカバーしているものではない)。
また、自然言語処理関数を利用する場合においても、既存のPEGに従う方法では、書き下す抽出パターンは約20個であった。ただし、自然言語処理関数を利用する場合、そのパーズ結果の抽象構文木の処理のためのプログラミングが別途必要であり、さらに当該プログラミングは抽出パターンごとに必要であった。抽象構文木の処理は、ツリーマッチング等による必要部分の抽出、及び必要部分への自然言語処理を含む。
このように、従来技術による方法では、自然文を含むテキストを全て形式的に書き下すことは労力を必要とし、また設計ごとに記法が異なったり、又は設計文書若しくは要求文書で使われる独自記法又はテンプレートなどの形式的な部分の記法の変更が頻繁に生じたりするので、パターン以外の部分を作り込むことが難しい。
実施例4
図20は、本発明の実施態様に従い、拡張された文法記述から生成される組み合わせパーサーを使用して生成される抽象構文木の例を示す。
図20は、本発明の実施態様に従い、拡張された文法記述から生成される組み合わせパーサーを使用して生成される抽象構文木の例を示す。
従来のPEGのみでは、PEGによるパーズでない他の処理(例えば、受理言語を有しない既存の自然言語処理)でパーズする部分を文法上で明示的に指定することができない。
発明の実施態様に従うと、他の処理でパーズする部分を文法上で明示的に指定することが可能である。すなわち、他の処理でパーズしない部分をスキップすることが可能である。
抽象構文木2001は、本発明の実施態様に従う組み合わせパーサーによる処理結果として生成されたものである。組み合わせパーサーの例は、下記の通りである。
発明の実施態様に従うと、他の処理でパーズする部分を文法上で明示的に指定することが可能である。すなわち、他の処理でパーズしない部分をスキップすることが可能である。
抽象構文木2001は、本発明の実施態様に従う組み合わせパーサーによる処理結果として生成されたものである。組み合わせパーサーの例は、下記の通りである。
<Result-And-Conditions>::=
(次のすべてが成り立つ場合/以下のすべてが成り立つ場合)、((!<改行>).)* <改行>
( ・ ((!<改行>).)* <改行> ) +
(次のすべてが成り立つ場合/以下のすべてが成り立つ場合)、((!<改行>).)* <改行>
( ・ ((!<改行>).)* <改行> ) +
((!<改行>).)* の部分(2箇所)が、否定先読み等により、スキップする部分を明示的に指定するための記述である。なお、「.」は、任意の文字を示す。
抽象構文木2001では、形式言語部分が受理しない部分の処理結果を含む木が直接得られる。従って、本発明の実施態様に従えば、分析対象に即して少ない労力で処理をすることが可能になる。
(比較例)
抽象構文木2002は、既存のPEG記法に従うパーサーによる処理結果として生成されたものである。抽象構文木2002では、形式言語処理パーサーが入力文字全体をパーズするために、スキップさせたい部分を含む構文木が出力される(2002)。
そこで、スキップさせたい部分を適切に処理するためには、既存のPEG記法での処理を個別に作成する必要がある。
処理1として、構文木の構造及び文字列パターンマッチングにより、ラベルを付与する(2003)。処理1では、スキップさせたい部分のパターン及びPEG外処理でのマッチングパターンが文法と適切に連動するように個々に定義するのが煩雑であり、また、スキップさせたい部分のパターン及びPEG外の処理でのマッチングパターンが複雑になりやすい。
処理2として、ラベルS1に自然言語処理関数を適用し、ラベルS2に自然言語処理関数をさらに適用する。
抽象構文木2002は、既存のPEG記法に従うパーサーによる処理結果として生成されたものである。抽象構文木2002では、形式言語処理パーサーが入力文字全体をパーズするために、スキップさせたい部分を含む構文木が出力される(2002)。
そこで、スキップさせたい部分を適切に処理するためには、既存のPEG記法での処理を個別に作成する必要がある。
処理1として、構文木の構造及び文字列パターンマッチングにより、ラベルを付与する(2003)。処理1では、スキップさせたい部分のパターン及びPEG外処理でのマッチングパターンが文法と適切に連動するように個々に定義するのが煩雑であり、また、スキップさせたい部分のパターン及びPEG外の処理でのマッチングパターンが複雑になりやすい。
処理2として、ラベルS1に自然言語処理関数を適用し、ラベルS2に自然言語処理関数をさらに適用する。
図21は、既存の文法記述PEG(図5)と本発明の実施態様において新たに追加される文法記述(図6)との文法の記述力の関係を示す。
本発明の実施態様において、PEGと呼ばれる文法記述を使用しうる。当該文法は、パーサーの処理手順を記述する。PEGの形式に従って文法を記述することで下記の特徴がある;
(1)PEGの形式に従って文法を記述すると、そこから生成したパーサーのパーズ処理結果が必ず一意に決定されることが証明されており、シフト還元衝突(shift/reduce conflict)のような問題が生じない。
(2)PEGの記述できる文法は、LALR(1)パーサーの扱える文法を網羅していることが証明されている。LALR(1)は、一般的なLALRパーサーであり、正規表現を用いた字句解析と先読み1のLALRパーサーとの組み合わせたものである。
なお、図21中、CFG(Context Free Grammar)は文脈自由文法を示す。
本発明の実施態様において、PEGの形式に従ってルール群を拡張した場合、拡張された(追加された)文法記述は、上記(1)及び(2)の特徴を保持したまま拡張されている。
本発明の実施態様において、PEGと呼ばれる文法記述を使用しうる。当該文法は、パーサーの処理手順を記述する。PEGの形式に従って文法を記述することで下記の特徴がある;
(1)PEGの形式に従って文法を記述すると、そこから生成したパーサーのパーズ処理結果が必ず一意に決定されることが証明されており、シフト還元衝突(shift/reduce conflict)のような問題が生じない。
(2)PEGの記述できる文法は、LALR(1)パーサーの扱える文法を網羅していることが証明されている。LALR(1)は、一般的なLALRパーサーであり、正規表現を用いた字句解析と先読み1のLALRパーサーとの組み合わせたものである。
なお、図21中、CFG(Context Free Grammar)は文脈自由文法を示す。
本発明の実施態様において、PEGの形式に従ってルール群を拡張した場合、拡張された(追加された)文法記述は、上記(1)及び(2)の特徴を保持したまま拡張されている。
Claims (20)
- 少なくとも2の言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法であって、コンピュータが、
下記に特定された文法記述の少なくとも1つに関連付けられた各パーサーを組み合わせて、組み合わせパーサーを生成するステップを実行する、前記方法:
第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、前記第2のパーサーを使用して、当該第2のパーサーで前記最初に受理可能な少なくとも1つの入力文字列をパーズする文法記述P1 U P2、及び
第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズする文法記述P1 F P2。 - 前記コンピュータが、
複数の文法記述を含む宣言的記述を受け取るステップと、
前記受け取った宣言的記述をパーズして、当該宣言的記述中に示される各文法記述の組み合わせを特定するステップであって、前記文法記述は、前記文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有している、前記特定するステップと
を実行することをさらに含み、
前記組み合わせパーサーを生成するステップにおいて、前記特定するステップにおいて特定された各文法記述に関連付けられた各パーサーが組み合わされて、組み合わせパーサーが生成される、請求項1に記載の方法。 - 前記文法記述P1 U P2又は前記文法記述P1 F P2において、P1又はP2のうちの一方の文法記述が、受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理関数(以下、当該文法記述をNともいう)である、請求項1又は2に記載の方法。
- 前記文法記述Nにおいて、前記文字列処理関数が自然言語処理名である、請求項3に記載の方法。
- 前記文法記述P1 U P2又は前記文法記述P1 F P2において、P1又はP2のうちの一方の文法記述が受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理関数(以下、当該文法記述をNともいう)であり、及び他方の文法記述が形式言語処理パーサーの指定である、請求項1又は2に記載の方法。
- 前記文法記述Nにおいて、前記文字列処理関数が自然言語処理名である、請求項5に記載の方法。
- 前記文法記述P1 F P2において、前記第2の文法記述(P2)で受理可能であり且つ前記入力文字列の先頭文字列を含む少なくとも1つの入力文字列が、当該先頭文字列から最長の文字列である、請求項1又は2に記載の方法。
- 前記特定するステップが、前記宣言的記述中の文法記述のトップレベルでの組み合わせを特定することを含む、請求項2に記載の方法。
- 前記文法記述のトップレベルでの組み合わせを特定した後に、当該特定された組み合わせの少なくとも一方をパーズして、当該一方中に示される各文法記述の組み合わせをさらに特定するステップをさらに含む、請求項8に記載の方法。
- 請求項1〜9のいずれか一項に記載の組み合わせパーサーを使用する方法であって、コンピュータが、
情報が抽出されるべきデータを受け取るステップと、
前記第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能な部分文字列を前記データ中から見つけるステップと、
前記データの先頭文字列から前記見つけられた部分文字列の先頭直前までの部分文字列を前記第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、
前記見つけられた部分文字列を前記第2のパーサーでパーズするステップと、
前記第1のパーサーでパーズして得られる第1の解析結果と、前記第2のパーサーでパーズして得られる第2の解析結果とから構文木を作成するステップと
を実行することを含む、前記方法。 - 請求項1〜9のいずれか一項に記載の組み合わせパーサーを使用する方法であって、コンピュータが、
検査されるべきデータを受け取るステップと、
前記第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーが受理可能であり且つ前記データの先頭文字列を含む少なくとも1つの部分文字列を前記データ中から見つけるステップと、
前記見つけられた部分文字列を前記第1の文法記述(P1)に関連付けられた第1のパーサーでパーズするステップと、
前記第1のパーサーでパーズして得られる第1の解析結果から構文木を作成するステップと
を実行することを含む、前記方法。 - 少なくとも2の言語処理パーサーを組み合わせて、組み合わせパーサーを生成するコンピュータであって、
プロセッサと、
前記プロセッサに接続されたメモリと、
下記に特定された各文法記述の少なくとも1つに関連付けられた各パーサーを組み合わせて、組み合わせパーサーを前記メモリ内に生成するパーサー生成部
を備えている、前記コンピュータ:
第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、入力文字列の先頭文字列から第2の文法記述(P2)に関連付けられた第2のパーサーで最初に受理可能な少なくとも1つの入力文字列の直前の入力文字列までをパーズし、前記第2のパーサーを使用して、当該第2のパーサーで前記最初に受理可能な少なくとも1つの入力文字列をパーズする文法記述P1 U P2、及び
第2の文法記述(P2)に関連付けられた第2のパーサーを使用して、当該第2のパーサーで受理可能であり且つ入力文字列の先頭文字列を含む少なくとも1つの入力文字列をパーズし、第1の文法記述(P1)に関連付けられた第1のパーサーを使用して、当該パーズされた少なくとも1つの入力文字列をパーズする文法記述P1 F P2。 - 前記コンピュータが、
複数の文法記述を含む宣言的記述を記述するためのエディタ部と、
宣言的記述をパーズして、当該宣言的記述中に示される各文法記述の組み合わせを特定する解釈部であって、前記文法記述は、前記文法記述は、前記文法記述P1 U P2及び文法記述P1 F P2から選ばれる少なくとも1つを有している、前記解釈部と
をさらに備えており、
前記パーサー生成部が、前記解釈部において特定された各文法記述に関連付けられた各パーサーを組み合わせて、組み合わせパーサーを生成する、請求項12に記載のコンピュータ。 - 前記文法記述P1 U P2又は前記文法記述P1 F P2において、P1又はP2のうちの一方の文法記述が、受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理関数(以下、当該文法記述をNともいう)である、請求項12又は13に記載のコンピュータ。
- 前記文法記述P1 U P2又は前記文法記述P1 F P2において、P1又はP2のうちの一方の文法記述が受理言語を持たず且つ入力文字列の全てを受理してパーズする文字列処理関数(以下、当該文法記述をNともいう)であり、及び他方の文法記述が形式言語処理パーサーの指定である、請求項12又は13に記載のコンピュータ。
- 前記文法記述P1 F P2において、前記第2の文法記述(P2)で受理可能であり且つ前記入力文字列の先頭文字列を含む少なくとも1つの入力文字列が、当該先頭文字列から最長の文字列である、請求項12又は13に記載のコンピュータ。
- 前記解釈部が、前記宣言的記述中の文法記述のトップレベルでの組み合わせを特定する、請求項13に記載のコンピュータ。
- 前記解釈部が、前記文法記述のトップレベルでの組み合わせを特定した後に、当該特定された組み合わせの少なくとも一方をパーズして、当該一方中に示される各文法記述の組み合わせをさらに特定する、請求項17に記載のコンピュータ。
- 少なくとも2の言語処理パーサーを組み合わせて、組み合わせパーサーを生成するコンピュータ・プログラムであって、コンピュータに請求項1〜9のいずれか一項に記載の方法の各ステップを実行させる前記コンピュータ・プログラム。
- 組み合わせパーサーを使用するコンピュータ・プログラムであって、コンピュータに請求項10又は11に記載の方法の各ステップを実行させる前記コンピュータ・プログラム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010205942A JP2012063868A (ja) | 2010-09-14 | 2010-09-14 | 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム |
US13/231,015 US8838440B2 (en) | 2010-09-14 | 2011-09-13 | Generating parser combination by combining language processing parsers |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010205942A JP2012063868A (ja) | 2010-09-14 | 2010-09-14 | 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012063868A true JP2012063868A (ja) | 2012-03-29 |
Family
ID=45807555
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010205942A Pending JP2012063868A (ja) | 2010-09-14 | 2010-09-14 | 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム |
Country Status (2)
Country | Link |
---|---|
US (1) | US8838440B2 (ja) |
JP (1) | JP2012063868A (ja) |
Families Citing this family (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2015505082A (ja) * | 2011-12-12 | 2015-02-16 | インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation | 情報ドメインに対する自然言語処理モデルの生成 |
US10957310B1 (en) | 2012-07-23 | 2021-03-23 | Soundhound, Inc. | Integrated programming framework for speech and text understanding with meaning parsing |
US9880820B2 (en) * | 2013-06-02 | 2018-01-30 | Microsoft Technology Licensing, Llc | Programming language with extensions using dynamic keywords |
US11295730B1 (en) | 2014-02-27 | 2022-04-05 | Soundhound, Inc. | Using phonetic variants in a local context to improve natural language understanding |
US9606980B2 (en) | 2014-12-16 | 2017-03-28 | International Business Machines Corporation | Generating natural language text sentences as test cases for NLP annotators with combinatorial test design |
CN107832229B (zh) * | 2017-12-03 | 2021-06-11 | 中国直升机设计研究所 | 一种基于nlp的系统测试用例自动生成方法 |
US10991369B1 (en) * | 2018-01-31 | 2021-04-27 | Progress Software Corporation | Cognitive flow |
US11954613B2 (en) * | 2018-02-01 | 2024-04-09 | International Business Machines Corporation | Establishing a logical connection between an indirect utterance and a transaction |
US10897368B2 (en) * | 2018-04-17 | 2021-01-19 | Cisco Technology, Inc. | Integrating an interactive virtual assistant into a meeting environment |
US11157704B2 (en) * | 2018-06-18 | 2021-10-26 | DataChat.ai | Constrained natural language processing |
US11947907B2 (en) * | 2020-02-21 | 2024-04-02 | Nippon Telegraph And Telephone Corporation | Analysis device, analysis method, and analysis program |
US20220261538A1 (en) * | 2021-02-17 | 2022-08-18 | Inteliquet, Inc. | Skipping natural language processor |
US20220334709A1 (en) | 2021-04-14 | 2022-10-20 | DataChat.ai | User interface for data analytics systems |
Family Cites Families (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0827797B2 (ja) | 1986-12-01 | 1996-03-21 | 松下電器産業株式会社 | 構文解析装置 |
JPS63221475A (ja) | 1987-03-11 | 1988-09-14 | Matsushita Electric Ind Co Ltd | 構文解析方法 |
US5251292A (en) * | 1990-07-25 | 1993-10-05 | Wordperfect Corporation | Method and apparatus for an equation editor |
US5386570A (en) | 1993-05-24 | 1995-01-31 | Hewlett-Packard Company | Method for a two pass compiler with the saving parse states from first to second pass |
US6311327B1 (en) * | 1998-03-02 | 2001-10-30 | Applied Microsystems Corp. | Method and apparatus for analyzing software in a language-independent manner |
US6434523B1 (en) * | 1999-04-23 | 2002-08-13 | Nuance Communications | Creating and editing grammars for speech recognition graphically |
JP2000339552A (ja) | 1999-05-26 | 2000-12-08 | Mitsubishi Electric Corp | パーサ呼び出しシステム |
US6321190B1 (en) | 1999-06-28 | 2001-11-20 | Avaya Technologies Corp. | Infrastructure for developing application-independent language modules for language-independent applications |
JP4282184B2 (ja) | 1999-10-26 | 2009-06-17 | パナソニック株式会社 | キーボタン照光装置およびキーボタン照光装置付き無線通信端末装置 |
CN1465018A (zh) * | 2000-05-11 | 2003-12-31 | 南加利福尼亚大学 | 机器翻译技术 |
US7027975B1 (en) * | 2000-08-08 | 2006-04-11 | Object Services And Consulting, Inc. | Guided natural language interface system and method |
US7152229B2 (en) * | 2002-01-18 | 2006-12-19 | Symbol Technologies, Inc | Workflow code generator |
JP4337309B2 (ja) | 2002-07-12 | 2009-09-30 | 日本電気株式会社 | ブラウザ装置 |
JP3910901B2 (ja) | 2002-09-30 | 2007-04-25 | 株式会社東芝 | 文書構造検索方法、文書構造検索装置および文書構造検索プログラム |
JP4230978B2 (ja) | 2004-10-05 | 2009-02-25 | 秀和 近藤 | 情報処理装置 |
WO2008048090A2 (en) * | 2006-10-18 | 2008-04-24 | Calculemus B.V. | Method, device, computer program and computer program product for processing linguistic data in accordance with a formalized natural language. |
WO2008070860A2 (en) * | 2006-12-07 | 2008-06-12 | Linker Sheldon O | Method and system for machine understanding, knowledge, and conversation |
US20100191632A1 (en) * | 2007-12-04 | 2010-07-29 | Hogan Apollo | Valuation of contingent financial claims using declarative programming techniques |
JP4796108B2 (ja) | 2008-09-26 | 2011-10-19 | 株式会社東芝 | 構造化文書検索装置、方法及びプログラム |
US8433559B2 (en) * | 2009-03-24 | 2013-04-30 | Microsoft Corporation | Text analysis using phrase definitions and containers |
US8341096B2 (en) * | 2009-11-27 | 2012-12-25 | At&T Intellectual Property I, Lp | System, method and computer program product for incremental learning of system log formats |
-
2010
- 2010-09-14 JP JP2010205942A patent/JP2012063868A/ja active Pending
-
2011
- 2011-09-13 US US13/231,015 patent/US8838440B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US8838440B2 (en) | 2014-09-16 |
US20120065960A1 (en) | 2012-03-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2012063868A (ja) | 言語処理パーサーを組み合わせて、組み合わせパーサーを生成する方法、並びにそのコンピュータ及びコンピュータ・プログラム | |
US8607206B2 (en) | Automatic synchronous-to-asynchronous software application converter | |
US7543271B2 (en) | Compiling source code using generic classes | |
US7478366B2 (en) | Debugger and method for debugging computer programs across multiple programming languages | |
US7865870B2 (en) | Automatic content completion of valid values for method argument variables | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
US8850414B2 (en) | Direct access of language metadata | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
US10303467B2 (en) | Target typing-dependent combinatorial code analysis | |
US20110271250A1 (en) | Software Development Tool | |
CN113741869B (zh) | 一种高性能的可变语法编程语言的构造方法 | |
US9390117B2 (en) | Method of transforming sets of input strings into at least one pattern expression that is string expressing sets of input strings, method of extracting transformation pattern as approximate pattern expression, and computer and computer program for the methods | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
US8776010B2 (en) | Data type provider for a data store | |
US20050055682A1 (en) | Authoring and using generic classes in JAVA language code | |
US10983771B1 (en) | Quality checking inferred types in a set of code | |
US20080141230A1 (en) | Scope-Constrained Specification Of Features In A Programming Language | |
JP2879099B1 (ja) | 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置 | |
KR102614967B1 (ko) | 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법 | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
Johnstone et al. | Evaluating GLR parsing algorithms | |
EP3121711B1 (en) | Action designing device and action designing program | |
Grigorev et al. | String-embedded language support in integrated development environment | |
JP2016051367A (ja) | データ解析装置、データ解析方法、および、プログラム。 | |
CN114816425B (zh) | 将自动化语言程序转换为lua语言程序的方法和系统 |