00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "PosTagger.h"
00025
00026 extern "C" {
00027 #include "tree-tagger-api.h"
00028 }
00029
00030 namespace Parser {
00031
00032 PosTagger::PosTagger(char const* PosParameters)
00033 {
00034 if (!init_treetagger((char *)PosParameters))
00035 throw PosTaggerError("POS Tagger initialization failed");
00036 int num_tags;
00037 for (char** tagit = tagger_tags(&num_tags); num_tags; --num_tags, ++tagit)
00038 tags.insert(*tagit);
00039 }
00040
00041 bool PosTagger::tag(Tagged& sentence)
00042 {
00043 size_t len = sentence.length();
00044
00045 sentence.tags.resize(len);
00046 sentence.lemmas.resize(len);
00047
00048
00049 TAGGER_STRUCT ts;
00050 ts.word = (char**)&(*sentence.words.begin());
00051 ts.tag = (char**)&(*sentence.tags.begin());
00052 ts.lemma = (char**)&(*sentence.lemmas.begin());
00053 ts.number_of_words = (int)len;
00054
00055 return tag_sentence(&ts);
00056 }
00057
00058
00059
00060
00061 struct Correspondence
00062 {
00063 char const* TT;
00064 char const* Penn;
00065 };
00066
00067 static Correspondence const PosCorrespondenceTable[] = {
00068
00069 "NP", "NNP",
00070 "NPS", "NNPS",
00071 "PP", "PRP",
00072 "PP$", "PRP$",
00073 "VV", "VB",
00074 "VVD", "VBD",
00075 "VVG", "VBG",
00076 "VVN", "VBN",
00077 "VVP", "VBP",
00078 "VVZ", "VBZ",
00079 "VH", "VB",
00080 "VHD", "VBD",
00081 "VHG", "VBG",
00082 "VHN", "VBN",
00083 "VHP", "VBP",
00084 "VHZ", "VBZ",
00085 "SENT", ".",
00086 0
00087 };
00088
00089 PennPosTagger::PosMap PennPosTagger::posMap;
00090 PennPosTagger::PosMap PennPosTagger::inversePosMap;
00091
00092 PennPosTagger::PennPosTagger(const char* PosParameters) :
00093 PosTagger(PosParameters)
00094 {
00095
00096 if (posMap.empty()) {
00097 for (Correspondence const* e = PosCorrespondenceTable; e->TT; ++e) {
00098 posMap[string(e->TT)] = e->Penn;
00099 inversePosMap[string(e->Penn)] = e->TT;
00100 }
00101 }
00102 }
00103
00104 bool PennPosTagger::tag(Tagged& sentence)
00105 {
00106 size_t len = sentence.length();
00107
00108 sentence.tags.resize(len);
00109 sentence.lemmas.resize(len);
00110
00111
00112 TAGGER_STRUCT ts;
00113 ts.word = (char**)&(*sentence.words.begin());
00114
00115 for (vector<char const*>::iterator sit = sentence.tags.begin();
00116 sit != sentence.tags.end(); ++sit) {
00117 if (*sit)
00118 *sit = inversePosMap[*sit];
00119 }
00120 ts.tag = (char**)&(*sentence.tags.begin());
00121 ts.lemma = (char**)&(*sentence.lemmas.begin());
00122 ts.number_of_words = (int)len;
00123
00124 bool res = tag_sentence(&ts);
00125 if (res) {
00126
00127
00128 for (int i = 0; i < len; i++) {
00129 PosMap::const_iterator mit = posMap.find(ts.tag[i]);
00130 if (mit != posMap.end())
00131 ts.tag[i] = (char*)mit->second;
00132 }
00133 }
00134 return res;
00135 }
00136
00137 }
00138