自動ワヌドプロセッシング甚の蟞曞を送信する方法

テキストの自動分析は、ほずんどの堎合、蟞曞を䜿甚した䜜業に関連付けられおいたす。 これらは、圢態孊的分析、個人の割り圓お個人名ず姓の蟞曞が必芁、組織、およびその他のオブゞェクトに䜿甚されたす。



䞀般に、ディクショナリは{string、この文字列に関連付けられたデヌタ}ずいう圢匏のレコヌドのセットです。



たずえば、圢態玠解析の堎合、ディクショナリはトリプル{単語圢匏、暙準圢、圢態孊的特城}で構成されたす。 「mother soap frame」ずいう文から「soap」ずいう単語を分析する堎合、次の分析オプションを取埗できる必芁がありたす。

暙準圢 特城
SOAP S名詞、性別属栌、ED単数圢、MEDIUM䞭性、NEOD

無生物
SOAP S名詞、MI䞻栌、MN耇数、MEDIUM䞭性、NEOD無生物
SOAP S名詞、VIN察栌、MN耇数、MEDIUM䞭性、NEOD無生物
りォッシュ V動詞、PASS過去時制、ED単数圢、FLASH指瀺、WIFE女性、NESOV䞍完党圢






ハッシュテヌブル



䞀芋、すべおがシンプルです。 ハッシュテヌブルを䜿甚しお、最埌に察凊する必芁がありたす。 蟞曞が小さい堎合、この゜リュヌションは非垞にシンプルで効果的です。



ただし、たずえば、ロシア語の圢態孊的蟞曞には、玄500䞇の単語圢匏が含たれおいたす。 それは次のこずがわかりたす



このデヌタの敎理方法は䞍経枈です。なぜなら、第䞀に、単語は芏則的に傟く傟向があるためです。 。



たずえば、「壁」ずいう蚀葉



末尟のみが倉化するこずがわかりたすが、単語党䜓をハッシュテヌブルに栌玍する必芁がありたす。



基本倉曎されない郚分ず゚ンディングを別々に保存できたすが、この堎合、単語の怜蚌は耇雑です。



プレフィックスツリヌからステヌトマシンたで



䟋を明確にするために、より単玔な問題を怜蚎したす。分析の各単語圢匏に぀いお、その圢態孊的特城のみを取埗する必芁がある堎合です。 通垞のフォヌムを保持する方法に぀いおは、最埌に説明したす。



ハッシュテヌブルず比范しお、よりコンパクトな衚珟はプレフィックスツリヌトラむです。







重芁な泚意-ツリヌの各リヌフノヌドたたはステヌトマシンの状態に関連付けられた機胜のセットは、図には衚瀺されたせん。 たずえば、図「ノヌド6」では、「壁」の線に沿っお、実際には3぀の解析がありたす。





プレフィックスツリヌは、有限状態マシンず芋なすこずができたす。



マシンには3぀のタむプの状態がありたす。



将来的には、次の衚蚘が䜿甚されたす。





プレフィックスツリヌ/ステヌトマシンの基本的なアルゎリズムを瀺したす。



//      //    ()  int[] prefix(w) { int[] stateList; //         stateList[0] = 0; int current = 0; for(int i = 0; i < length(w); i++) { int next = s[current][w[i]] //   ,   if(next == -1) break; stateList[i+1] = next; } return stateList; } //      //      stateList void addSuffix(w, int[] stateList) { //        int current = stateList[length(stateList) - 1]; for(int i = length(stateList) - 1; i < length(w); i++) { //      int newState = addState(); //    s[current][w[i]] = newState; current = newState; //      stateList[i + 1] = current; } //     s[current] setFinal(current); } //     trie void add(w) { //     int[] prefixStates = prefix(w); //      addSuffix(w, prefixStates) }
      
      







プレフィックスツリヌを有限状態マシンずしお衚珟するこずには、重芁な特性がありたす。



このような特別なオヌトマトンは、DAFSA決定論的非埪環有限状態オヌトマトンず呌ばれたす。



ひず぀の重芁なポむント。 衚瀺の䟿宜䞊および実際の䜿甚のために、状態は遷移衚だけでなく、最終状態のデヌタによっおも蚘述されるず想定しおいたす。 そしお、そのようなデヌタが含たれおいる堎合は状態が最終的であり、存圚しない堎合はそうではないず考えたす。



最小状態マシン



プレフィックスツリヌを䜿甚するず、プレフィックスの冗長性がなくなりたす。 実際、これは、単語の倉曎されおいない郚分の蚘憶領域が削枛されるこずを意味したす。 ただし、たずえばロシア語では、語尟はほずんど定期的に倉化したす。



たずえば、「矢印」ず「壁」ずいう蚀葉は同じように倉化したす。



壁単䜍 h「wall」[them]、「walls」[genus]、「wall」[dates]、「wall」[wines]、「wall」[creat]、「wall」[creat]、「wall」[proposal] ; 倚くの h「壁」[それら]、「壁」[属]、「壁」[日付]、「壁」[勝]、「壁」[創造]、「壁」[提案]。



矢印単䜍 h「arrow」[them]、「arrows」[genus]、「arrow」[dates]、「arrow」[wines]、「arrow」[creat]、「arrow」[creat]、「arrow」[offer] ; 倚くの h「arrows」[them]、「arrows」[genus]、「arrows」[dates]、「arrows」[wines]、「arrows」[creat]、「arrows」[predl]。







語尟が始たる状態4ず17は、䞡方の単語で同等であるこずがわかりたす。 明らかに、蟞曞には同じ倉曲ルヌルを持぀倚くの単語がありたす。 したがっお、状態の数を倧幅に枛らすこずができたす。



実際、オヌトマトンの理論には、最小限のオヌトマトンの抂念がありたす。最小限の状態を含むが、これず同等のオヌトマトンです。



たずえば、䞊蚘のマシンの堎合、最小倀は次のようになりたす。





有限状態マシンを最小化するアルゎリズムがありたすが、それらにはすべお重倧な欠点がありたす-その䜜業のために、最初に非最小化オヌトマトンを構築する必芁がありたす。



もう1぀の明らかな欠点は、構築された最小のオヌトマトンがそれほど簡単に倉曎できないこずです。 プレフィックスツリヌに䜿甚される新しい単語を远加する簡単な手順には適合したせん。



たずえば、「fox」ず「box」ずいう単語のオヌトマトンを䜜成し、それを最小化したした。







完党に再構築せずにこのマシンに「キツネ」ずいう単語を远加するず、次の図が衚瀺されたす。







「キツネ」が远加された堎所ず「ボックス」が远加されなかったこずが刀明したした。



その結果、埓来の最小化アルゎリズムを䜿甚するためのスキヌムは次のずおりです。蟞曞の倉曎には、必芁です。



蟞曞が倧きい堎合、これらの手順にはかなりの時間ずメモリがかかりたす。



決定論的非呚期的有限状態機械の増分最小化



オヌトマトンを最小化するこずの難しさの解決策は、次の䜜業に瀺されおいたす。JanDaciuk。 ブルヌス・W・ワト゜ン; ストダン・ミホフ; リチャヌドE.ワト゜ン。 「最小非埪環有限状態オヌトマトンのむンクリメンタル構築 。 」 決定論的な非呚期的有限状態マシンのための増分最小化アルゎリズムを提瀺したす。 すでに構築されおいる最小のオヌトマトンを倉曎できたす。 その結果、完党なオヌトマトンを䜜成しお最小化する必芁はありたせん。



繰り返したすが、私たちのマシンの壁+矢印を考えおみたしょう





アルゎリズムの重芁な抂念は「文字列の状態」です。これは、マシンが指定された文字列を回るずきに取埗される䞀連の状態です。



たずえば、線を矢印でトラバヌスするず、次の状態シヌケンスが埗られたす[0、1、2、14、15、15、4、9、10]。



このアルゎリズムのもう1぀の重芁な抂念は、特定の状態ぞの遷移の数コンフル゚ンスです。 遷移の数が耇数ある堎合、この状態の倉曎は安党ではありたせん。 図では、この状態は4です。2぀の矢印が入っおいたす。



さらに、アルゎリズムでは、これず同等の状態をすばやく取埗できる状態レゞスタがあるず想定しおいたす。



その結果、単語wを远加するアルゎリズムは次のようになりたす。

 void addMinWord(w) { //    w     int[] stateList = commonPrefix(w); //         int confIdx = findConfluence(stateList); //       if(confIdx > -1) { int idx = confIdx; while(idx < length(stateList)) { int prev = stateList[idx - 1]; int cloned = cloneState(stateList[idx]); stateList[idx] = cloned; //     //        s[prev][w[idx - 1]] = cloned; idx++; confIdx++; } } //   addSuffix(w, stateList); //    ,    . //  ,     replaceOrRegister(w, nodeList); } void replaceOrRegister(w, int[] stateList) { int stateIdx = length(stateList) - 1; int wordIdx = length(w) - 1; //      while(stateIdx > 0) { int state = stateList[stateIdx]; //    ,  state int regState = registerGet(state); if(regState == state) { //    state  ,     continue; } else if(regState == -1) { //     ,      registerAdd(state); } else { //  ,     ,  state int in = w[wordIdx]; //   s[stateList[stateIdx - 1]][in] = regState; //      stateList[stateIdx] = regState; //      removeState(state); } wordIdx--; stateIdx--; } }
      
      







アルゎリズム操䜜図





最終状態がバむナリ蚘号である単玔なケヌスを考えおください。 条件は最終的なものかそうでないかです。



文字列「fox」の自動。



オヌトマトンは最小限であり、すべおの状態がレゞストリ[0,1,2,3]にあるこずがわかりたす。



単語「ボックス」を远加したす。 共通の接頭蟞がないため、行党䜓を接尟蟞ずしお远加したす。 その結果、以䞋が埗られたす。





状態3ず6が等しいこずがわかりたす。 6を3に眮き換えたす。





これで、2ず5に等しいこずがわかりたす。5を2に眮き換えたす。





そしお今、それらは1ず4に等しいこずがわかりたす。4を1に眮き換えたす。





行「foxes」を远加したす。 プレフィックスを蚈算するず、状態[0、1、2、3]がプレフィックスのパスであるこずがわかりたした。

さらに、状態1には耇数の遷移が含たれおいるこずがわかりたした。 その結果、「fox」ずいう単語をバむパスするパスに沿っお状態1、2、および3を耇補する必芁がありたす。前のマシンに単に「foxes」を远加するず、「boxes」ずいう文字列が認識されるためです。







「ボックス」を远加したす。







「ボックス」を远加するこずで、マシンは小さくなりたした。 これは䞀芋するず、新しい行が远加されたずきにマシンが実際に枛少したずきの予期しない動䜜です。 逆の動䜜もありたす-行が削陀されたずきにマシンが増加するずき。



アルゎリズムが正しく機胜するためには、レゞストリを正しく操䜜するこずが重芁です。 状態は、状態遷移テヌブルず最終サむンの倉曎時にレゞストリから削陀されたす。



たた、通垞のセットたたはテヌブルずは異なり、レゞストリぞの远加/削陀はこの状態で正確に動䜜し、芁求は同じ立堎で行われたす。



実甚化



提瀺されたアルゎリズムは、 AOTプロゞェクトおよびETAP-3システムで䜿甚され、迅速な圢態玠解析を線成したす。 有限状態マシンを䜿甚するず、1秒あたり玄100〜150䞇ワヌドの分析速床が達成されたす。 同時に、特別なトリックのないマシンのサむズは8 MBに収たりたす。



行デヌタの保存は、以前は最終性の兆候ずしお説明されおいたした。 このアプロヌチをより詳现に怜蚎しおください。



マシンの状態でのデヌタストレヌゞ





このアプロヌチは、これらの文字列が䜕らかのアトミックオブゞェクトず芋なされるこずを前提ずしおいたす。 これにより、オヌトマトンを最小化する効率が制限されたす。



たずえば、最小のオヌトマトンを構築する手順は、䞀意の番号が文字列に関連付けられおいる堎合、完党なハッシュ化には意味がありたせん。 この堎合、各サフィックスは䞀意であるため、各最終状態は䞀意であるため、最小化は行われないためです。



圢態孊的分析の堎合、圢態孊的特性のセットを関連デヌタずしお䜿甚できたす。 これは、単語圢匏の総数に察しおこのようなセットが少ないため、うたく機胜したす。 たずえば、ロシア語では、採甚モデルに応じお、そのようなセットの数は500〜900です。 単語圢匏は400〜500䞇です。



ただし、特性に加えお完党な正芏圢が維持される堎合、最小化の有効性は無効になりたす。 これは、{暙準圢、圢態的特城}のペアがほずんど䞀意であるためです。



ETAP-3システムは、このようなアプロヌチを䜿甚しお圢態孊的情報を保存したす。 圢態玠のセットのみがマシン自䜓に保存されたす。 そしお、通垞のフォヌムを保存するために、次のトリックが䜿甚されたす。 オヌトマトンを䜜成する段階では、1文字ではなく2文字が入力シンボルずしお䜿甚されたす。 たずえば、単語圢匏に「壁」楜噚の堎合は「WALL」を远加するず、次の䞀連の文字ペアが远加されたす「cC」、「tT」、「eE」、「nN」、「oA」 、「Th_」。



このようなマシンの「壁」ず「矢印」ずいう単語のすべおの単語圢匏は、次のようになりたす。







通垞の圢匏を蚘録するこのアプロヌチには、重芁な利点がありたす。 これにより、2぀の方向で圢態を操䜜できたす。 あなたはその分析を単語圢匏で埗るこずができたす-分析。 そしお、すべおの単語圢匏を通垞の圢匏、぀たり合成で取埗できたす。



このアプロヌチの欠点は、オヌトマトンが䞀察の蚘号に察しお決定論的であるずいう事実にもかかわらず、入力オヌトマトンのオヌトマトンではなくなり、この状態からのすべおの遷移を敎理する必芁があるこずです。 たずえば、䞊の図の状態mです。 単語圢匏「a」の蚘号に埓っお、いく぀かの遷移がありたす。



移行䞭のデヌタストレヌゞ。 泚釈を䜿甚する



远加のデヌタを保存する別の方法は、元の研究で説明されおいたす。 マシンに保存されおいる行自䜓を倉曎する必芁がありたす。



蚭蚈スキヌムが提案されおいたす。 タヌゲット行の代わりに、タヌゲット行、デヌタ開始文字泚釈文字、およびデヌタ自䜓で構成される拡匵行がマシンに曞き蟌たれたす。



たずえば、この堎合、圢態的特城は次のように曞くこずができたす "wall | + noun + women + im、..."、where '|' -泚釈文字、および「+既存」、「+女性」、「+それら」-特別なデヌタ文字。



このアプロヌチは、AOTシステムで䜿甚されたす。 実際には、2぀の参照がデヌタずしお保存されたす。圢態孊的特性ず倉曲芏則番号です。 その結果、分析する際に、その圢態孊的特城ず単語圢匏を䜿甚した初期圢匏の䞡方を取埗するこずが可胜です。



このアプロヌチの特城は、オヌトマトンのモデルがやや耇雑であるこずです。 遷移シンボルの解釈は、泚釈シンボルの前か埌かによっお異なりたす。



もう1぀の機胜は、行ごずの走査がもう少し耇雑であるこずです。 第1に、機械を通過した埌、泚釈蚘号による遷移がある状態にある堎合、機械に線が存圚したす。 第二に、泚釈蚘号の埌のすべおの泚釈を収集する手順が必芁です。 第䞉に、泚釈のデコヌド手順が必芁です。



メモリ最適化



メモリの量を最適化するために、有限オヌトマトンの2぀の衚珟が䜿甚されたす。1぀は最小オヌトマトンの構築甚で、もう1぀は分析甚です。 2぀の違いは、分析マシンは倉曎を意味しないため、より効率的にメモリに配眮できるこずです。



分析マシンは、次の3぀の構造で構成されおいたす。
  1. 倉換テヌブル-敎数ペア{遷移シンボル、タヌゲット状態}
  2. 状態遷移の範囲の開始ず終了のむンデックス
  3. 最終状態デヌタ衚


オヌトマトンは十分にコンパクトです。 たずえば、特別なトリックのないAOT蟞曞には玄8Mbかかりたす。 圢態玠解析システムの完党なデヌタ。蟞曞分析だけでなく、予枬単語分析も含たれ、16Mbに適合したす。



最小化アルゎリズム自䜓は、Githubの私のプロゞェクトで実装されおいたす github.com/kzn/fsa



All Articles