言語の識別
インターシステムズは、InterSystems IRIS® 自然言語処理 (NLP) を非推奨Opens in a new tabにしました。インターシステムズ製品の今後のバージョンから削除される可能性があります。以下のドキュメントは、既存ユーザのみに向けたリファレンスとしています。代替のソリューションを見いだすためのサポートを必要とする既存ユーザはインターシステムズのサポート窓口Opens in a new tabにお問い合わせください。
この章では、文のレベルで適用される自動言語識別 (ALI) の構成方法および使用方法を説明します。また、いくつかの言語固有の問題についても説明します。
自動言語識別の構成
NLP 構成により、ソース・ドキュメント・コンテンツのための言語環境が確立します。構成はどの特定のソース・データ・セットにも依存しません。構成は定義することができますが、既定の構成を採用することもできます。構成を指定しない場合、既定は英語専用となり、自動言語識別は行われません。
構成では以下の言語オプションを定義します。
-
ソース・ドキュメントに含まれる言語、つまり、テストする言語と適用する言語モデルを指定します。使用可能なオプションは、Czech/cs (チェコ語)、Dutch/nl (オランダ語)、English/en (英語)、French/fr (フランス語)、German/de (ドイツ語)、Japanese/ja (日本語)、Portuguese/pt (ポルトガル語)、Russian/ru (ロシア語)、Spanish/es (スペイン語)、Swedish/sv (スウェーデン語)、および Ukrainian/uk (ウクライナ語) です。2 文字の ISO 言語コードを使用して、言語を指定します。複数の言語を InterSystems IRIS リスト構造として指定できます。
-
複数の言語を指定するときは、ブーリアン値を指定して自動言語識別を有効にします。
以下の例では、全ソース・テキストが英語またはフランス語であると想定した構成を作成し、自動言語識別をサポートしています。
SET myconfig="EnglishFrench"
IF ##class(%iKnow.Configuration).Exists(myconfig) {
SET cfg=##class(%iKnow.Configuration).Open(myconfig)
WRITE "Opened existing configuration ",myconfig,!
}
ELSE {
SET cfg=##class(%iKnow.Configuration).%New(myconfig,1,$LISTBUILD("en","fr"),"",1)
DO cfg.%Save()
IF ##class(%iKnow.Configuration).Exists(myconfig)
{WRITE "Configuration ",myconfig," now exists",! }
ELSE {WRITE "Configuration creation error" QUIT }
}
SET cfgId=cfg.Id
WRITE "with configuration ID ",cfgId,!
SET rnd=$RANDOM(2)
IF rnd {
SET stat=##class(%iKnow.Configuration).%DeleteId(cfgId)
IF stat {WRITE "Deleted the ",myconfig," configuration" }
}
ELSE {WRITE "No delete this time",! }
自動言語識別の使用
NLP は文ごとに自動言語識別を実行します。現在の構成で自動言語識別を有効にすると、NLP は各ソース・テキストの各文をテストして、構成で指定されたどの言語がその文で使用されているかを判別します。この識別は統計的確率です。これは、以下のような影響があります。
-
構成で指定された複数言語のテキストが 1 つの文に含まれている場合、NLP は、その文で優勢な言語と判別された言語に文を割り当てます。
-
構成で指定されていない言語 (または NLP がサポートしていない言語) で文が記述されている場合、NLP は指定された構成言語の 1 つに文を割り当てます。
NLP はその後、この言語判別結果を使用して、CRC などの NLP 分析での判定を行います。
このように、ソース・テキストとソース・テキスト内の文は、異なる言語で記述される可能性もあります。NLP は、適用する言語モデルを自動的に判別します。また、自動言語識別は、その言語識別の信頼度を、パーセンテージを示す整数値で割り当てます。信頼度の範囲は 100 (完全に信頼できる) ~ 0 (不確定) となります。自動言語識別が有効でない場合、すべての文には信頼度 0 が割り当てられます。
言語識別クエリ
このドキュメント内の例で使用されているコーディングおよびデータの詳細は、"サンプル・プログラムに関するメモ" を参照してください。
以下の例では、GetTopLanguage()Opens in a new tab を使用して、ソースの言語および言語認識における信頼度を認識しています。言語認識は文レベルで実行されるので、ソースの言語はコンポーネントの文に対する言語認識の信頼度を平均化した結果となります。このメソッドは 2 文字の省略形で言語を返します (この場合、“en”)。totlangconf (文に対する言語信頼度の合計) は、numsent ではなく、numlangsent で除算する必要があることに注意してください。これら 2 つの文の数は通常同じですが、常に同じではありません。これは、ソースに判別不能な言語の文が含まれる可能性があるためです。
Configuration
SET myconfig="EnFr"
IF ##class(%iKnow.Configuration).Exists(myconfig)
{SET cfg=##class(%iKnow.Configuration).Open(myconfig) }
ELSE {SET cfg=##class(%iKnow.Configuration).%New(myconfig,1,$LISTBUILD("en","fr"),"",1)
DO cfg.%Save() }
SET cfgId=cfg.Id
DomainCreateOrOpen
SET dname="mydomain"
IF (##class(%iKnow.Domain).NameIndexExists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
GOTO DeleteOldData }
ELSE
{ WRITE "The ",dname," domain does not exist",!
SET domoref=##class(%iKnow.Domain).%New(dname)
DO domoref.%Save()
WRITE "Created the ",dname," domain with domain ID ",domoref.Id,!
GOTO ListerAndLoader }
DeleteOldData
SET stat=domoref.DropData()
IF stat { WRITE "Deleted the data from the ",dname," domain",!!
GOTO ListerAndLoader }
ELSE { WRITE "DropData error ",$System.Status.DisplayError(stat)
QUIT}
ListerAndLoader
SET domId=domoref.Id
SET flister=##class(%iKnow.Source.SQL.Lister).%New(domId)
SET stat=flister.SetConfig(myconfig)
IF stat '= 1 { WRITE "SetConfig error ",$System.Status.DisplayError(stat)
QUIT }
SET myloader=##class(%iKnow.Source.Loader).%New(domId)
QueryBuild
SET myquery="SELECT Top 10 ID AS UniqueVal,Type,NarrativeFull FROM Aviation.Event"
SET idfld="UniqueVal"
SET grpfld="Type"
SET dataflds=$LB("NarrativeFull")
UseLister
SET stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds)
IF stat '= 1 {WRITE "The lister failed: ",$System.Status.DisplayError(stat) QUIT }
UseLoader
SET stat=myloader.ProcessBatch()
IF stat '= 1 {WRITE "The loader failed: ",$System.Status.DisplayError(stat) QUIT }
GetSources
DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.result,domId)
SET i=1
WHILE $DATA(result(i)) {
SET intId = $LISTGET(result(i),1)
SET extId = $LISTGET(result(i),2)
SET numsent = ##class(%iKnow.Queries.SentenceAPI).GetCountBySource(domId,result(i))
WRITE !,extId," has ",numsent," sentences",!
SET srclang = ##class(%iKnow.Queries.SourceAPI).GetTopLanguage(domId,intId,.totlangconf,.numlangsent)
WRITE "Source language is ",srclang,!,"with a confidence % of ",totlangconf/numlangsent,!!
SET i=i+1
}
以下の例では、GetLanguage()Opens in a new tab を使用して、ソースの各文の言語および言語認識における信頼度を認識しています。このメソッドは、2 文字の省略形で言語を返し (ここでは “en”)、0 ~ 100 のパーセンテージで信頼度を返します。信頼度が 100% になることは、めったにありません。
Configuration
SET myconfig="EnFr"
IF ##class(%iKnow.Configuration).Exists(myconfig)
{SET cfg=##class(%iKnow.Configuration).Open(myconfig) }
ELSE {SET cfg=##class(%iKnow.Configuration).%New(myconfig,1,$LISTBUILD("en","fr"),"",1)
DO cfg.%Save() }
SET cfgId=cfg.Id
DomainCreateOrOpen
SET dname="mydomain"
IF (##class(%iKnow.Domain).NameIndexExists(dname))
{ WRITE "The ",dname," domain already exists",!
SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
GOTO DeleteOldData }
ELSE
{ WRITE "The ",dname," domain does not exist",!
SET domoref=##class(%iKnow.Domain).%New(dname)
DO domoref.%Save()
WRITE "Created the ",dname," domain with domain ID ",domoref.Id,!
GOTO ListerAndLoader }
DeleteOldData
SET stat=domoref.DropData()
IF stat { WRITE "Deleted the data from the ",dname," domain",!!
GOTO ListerAndLoader }
ELSE { WRITE "DropData error ",$System.Status.DisplayError(stat)
QUIT}
ListerAndLoader
SET domId=domoref.Id
SET flister=##class(%iKnow.Source.SQL.Lister).%New(domId)
SET stat=flister.SetConfig(myconfig)
IF stat '= 1 { WRITE "SetConfig error ",$System.Status.DisplayError(stat)
QUIT }
SET myloader=##class(%iKnow.Source.Loader).%New(domId)
QueryBuild
SET myquery="SELECT Top 10 ID AS UniqueVal,Type,NarrativeFull FROM Aviation.Event"
SET idfld="UniqueVal"
SET grpfld="Type"
SET dataflds=$LB("NarrativeFull")
UseLister
SET stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds)
IF stat '= 1 {WRITE "The lister failed: ",$System.Status.DisplayError(stat) QUIT }
UseLoader
SET stat=myloader.ProcessBatch()
IF stat '= 1 {WRITE "The loader failed: ",$System.Status.DisplayError(stat) QUIT }
GetOneSource
DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.result,domId)
FOR i=1:1:10 {
IF $DATA(result(i)) {
SET intId = $LISTGET(result(i),1)
SET extId = $LISTGET(result(i),2)
SET myconf=0
SET numSentS = ##class(%iKnow.Queries.SentenceAPI).GetCountBySource(domId,result(i))
WRITE !,extId," has ",numSentS," sentences",!
GetSentencesInSource
SET sentStat=##class(%iKnow.Queries.SentenceAPI).GetBySource(.sent,domId,intId)
IF sentStat=1 {
SET i=1
WHILE $DATA(sent(i)) {
SET sentnum=$LISTGET(sent(i),1)
WRITE "sentence:",sentnum
SET lang = ##class(%iKnow.Queries.SentenceAPI).GetLanguage(domId,sentnum,.myconf)
WRITE " language:",lang," confidence:",myconf,!
SET i=i+1
}
}
}
ELSE { WRITE !,"That's all folks!" }
}
自動言語識別のオーバーライド
LanguageFieldName ドメイン・パラメータを使用して、自動言語識別をオーバーライドすることができます。有効時には、このパラメータは、各ソースのメタデータ・フィールドにアクセスすることにより、どの言語を適用するか判断します。メタデータ・フィールドには、ISO 言語コードが含まれます。メタデータ・フィールド・データが存在する場合、自動言語識別がそのソースに対してオーバーライドされます。メタデータ・フィールドが空白または無効である場合、自動言語識別がそのソースに対して使用されます。LanguageFieldName ドメイン・パラメータは、既定で無効となっています。詳細は、このドキュメントの付録の "ドメイン・パラメータ" を参照してください。
言語固有の問題
ドイツ語 : ドイツ語の eszett (“ß”) の文字は、“ss” として標準化されます。ドイツ語では通常、EnableNgrams ドメイン・パラメータを設定する必要があります。