root/Lemmatizer.cpp

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lemmatize

   1 /* -*- coding: utf-8; mode: c++; -*-
   2  * Concordance to A. S. Pushkin's Works - Lemmatizer
   3  * $Id: Lemmatizer.cpp 1 2012-06-02 08:43:50Z isao $
   4  * Copyright (C) 2012, isao yasuda
   5  */
   6 
   7 #include "RussianLemmatizer.hpp"
   8 
   9 // ロシア語形態素解析 Lemmatizer 見出語選定
  10 void lemmatize(std::string& tword, tl::lemmatizer& lem)
  11 {
  12     // Lemmatizer 分析結果オブジェクト件数
  13     tl::lem_result lar;    // lemmatizer result
  14     size_t rcnt = lem.lemmatize<russian_utf8_adapter>(tword.c_str(), lar);
  15 
  16     wordst wst;                        // 見出語属性
  17     std::vector<wordst> wv;            // 見出語属性 vector
  18     std::vector<wordst>::iterator wit; // イテレータ
  19 
  20     // rcnt が 0 (解析失敗) なら終了
  21     if (rcnt < 1) {
  22         //std::cerr << "Lemmatizer analyze failed: " << tword << "\n";
  23         return;
  24     }
  25 
  26     // 見出し語候補 vector を生成し,最大プライオリティを確定
  27     int maxprio = 0;
  28     for (size_t i = 0; i < rcnt; i++) {
  29         u_int32_t src_form = lem.get_src_form(lar, i);
  30         wst.word = lem.get_text<russian_utf8_adapter>(lar, i, 0);
  31         wst.part = lem.get_part_of_speech(lar, i, src_form);
  32         wst.len  = wst.word.size();
  33         // 品詞番号でプライオリティ付け
  34         switch (wst.part) {
  35         case 0:
  36             wst.prio = 5;
  37             break; // существительное 名詞
  38         case 1:
  39             wst.prio = 4;
  40             break; // прилагательное 形容詞長語尾形
  41         case 2:
  42             wst.prio = 3;
  43             break; // глагол 動詞
  44         case 3:
  45             wst.prio = 5;
  46             break; // местоимение 代名詞
  47         case 4:
  48             wst.prio = 4;
  49             break; // местоимение 代名詞(関係詞など?)
  50         case 5:
  51             wst.prio = 4;
  52             break; // местоимение 代名詞?
  53         case 6:
  54             wst.prio = 4;
  55             break; // числительное 数詞
  56         case 7:
  57             wst.prio = 4;
  58             break; // порядковое числительное 順序数詞
  59         case 8:
  60             wst.prio = 3;
  61             break; // наречие 副詞
  62         case 9:
  63             wst.prio = 3;
  64             break; // предикатив 述語/副詞?
  65         case 10:
  66             wst.prio = 1;
  67             break; // предлог 前置詞
  68         case 11:
  69             wst.prio = 1;
  70             break; // POSL 後置詞?
  71         case 12:
  72             wst.prio = 1;
  73             break; // союз 接続詞
  74         case 13:
  75             wst.prio = 1;
  76             break; // междометие 間投詞
  77         case 14:
  78             wst.prio = 1;
  79             break; // (INP ?)
  80         case 15:
  81             wst.prio = 1;
  82             break; // (PHRASE 成句?)
  83         case 16:
  84             wst.prio = 1;
  85             break; // частица 小詞
  86         case 17:
  87             wst.prio = 3;
  88             break; // краткое прилагательное 形容詞短語尾形
  89         case 18:
  90             wst.prio = 2;
  91             break; // причастие 形動詞
  92         case 19:
  93             wst.prio = 2;
  94             break; // деепричастие 副動詞
  95         case 20:
  96             wst.prio = 2;
  97             break; // краткое причастие 形動詞短語尾形
  98         case 21:
  99             wst.prio = 3;
 100             break; // инфинитив 動詞不定形
 101 defaut:
 102             wst.prio = 1;
 103             break;
 104         }
 105         if (wst.prio >= maxprio)
 106             maxprio = wst.prio;
 107         wv.push_back(wst);
 108     }
 109 
 110     // 最大プライオリティ品詞をもつ候補語のなかで最小長のものを確定
 111     int minlen = 1000;
 112     std::vector<std::string> vcand;
 113     for (wit = wv.begin(); wit < wv.end(); wit++) {
 114         if ((*wit).prio == maxprio) {
 115             if ((*wit).len <= minlen) {
 116                 minlen = (*wit).len;
 117                 vcand.push_back((*wit).word);
 118             }
 119         }
 120     }
 121 
 122     // 最小長の候補語の最初のものを見出語に決定
 123     std::vector<std::string>::iterator sit;
 124     for (sit = vcand.begin(); sit != vcand.end(); sit++) {
 125         if ((*sit).size() ==  minlen) {
 126             tword = *sit;
 127             break;
 128         }
 129     }
 130 }
 131 

/* [previous][next][first][last][top][bottom][index][help] */