/* */
This source file includes following definitions.
- 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
/* */