IRLAS_DLL.cpp
上传用户:sz_zxd888
上传日期:2021-08-19
资源大小:6059k
文件大小:6k
源码类别:

词法分析

开发平台:

C/C++

  1. #define IRLAS_DLL_API_EXPORT
  2. #include "IRLAS_DLL.h"
  3. #include "IRLAS.h"
  4. static bool g_isLoadSegRes = false;
  5. Bigram* pBigram = NULL;
  6. Dictionary* pDict = NULL;
  7. HMM* pHmm[3] = { NULL, NULL, NULL };
  8. // some flags, for configuration
  9. int isNumTime = 1;
  10. int isPerson = 1;
  11. int isLocation = 1;
  12. int isPOSTag = 0;
  13. int isExtendedDict = 1;
  14. int isBigram = 0;
  15. int  bestPathNum = 1;
  16. /////////////////////////////////////////////////////////////////////////////////////
  17. /// read the configuration file and set the flags.
  18. /////////////////////////////////////////////////////////////////////////////////////
  19. int ReadConfigFile(const char *configFileName)
  20. {
  21. ifstream in(configFileName);
  22. if (!in)
  23. {
  24. cerr << "can't open the file " << configFileName << endl;
  25. return 0;
  26. }
  27. string line;
  28. while (getline(in, line))
  29. {
  30. string item = line.substr(0, line.find("="));
  31. if (item == "NumTime")
  32. {
  33. if (line.find("1") != string::npos) isNumTime = 1;
  34. }
  35. else if (item == "Person")
  36. {
  37. if (line.find("1") != string::npos) isPerson = 1;
  38. }
  39. else if (item == "Location")
  40. {
  41. if (line.find("1") != string::npos) isLocation = 1;
  42. }
  43. else if (item == "POSTag")
  44. {
  45. if (line.find("1") != string::npos) isPOSTag = 1;
  46. }
  47. else if (item == "ExtendedDict")
  48. {
  49. if (line.find("1") != string::npos) isExtendedDict = 1;
  50. }
  51. else if (item == "Bigram")
  52. {
  53. if (line.find("1") != string::npos) isBigram = 1;
  54. }
  55. else if (item == "BestPathNum")
  56. {
  57. string::size_type pos = line.find_first_not_of(' ', line.find("=")+1);
  58. bestPathNum = atoi(&line[pos]);
  59. }
  60. }
  61. in.close();
  62. return 1;
  63. }
  64. ///////////////////////////////////////////////////////////////
  65. // 函 数 名 : SetOption
  66. // 函数功能 : 为每个词法分析器对象设定识别选项
  67. // 处理过程 : 
  68. // 备    注 : 
  69. // 作    者 : taozi
  70. // 时    间 : 2006年3月31日
  71. // 返 回 值 : void
  72. // 参数说明 : void* pSegger,
  73. //  int isPER,
  74. //  int isLOC,
  75. //  int isPOS
  76. ///////////////////////////////////////////////////////////////
  77. void IRLAS_SetOption(void* pSegger, int isPER, int isLOC, int isPOS)
  78. {
  79. CIRLAS* irlas = (CIRLAS*)pSegger;
  80. isPerson = isPER;
  81. isLocation = isLOC;
  82. isPOSTag = isPOS;
  83. irlas->SetOptionNum(isPER, isLOC, isPOS);
  84. }
  85. /////////////////////////////////////////////////////////////////////////////////////
  86. /// dll interface function, initialize the resource classes according to the flags.
  87. /////////////////////////////////////////////////////////////////////////////////////
  88. int IRLAS_LoadResource(const char *configFileName, const char *resPathName)
  89. {
  90. // printf("LoadSegRes... Enter Key...n");
  91. // _getch();
  92. if (g_isLoadSegRes) return 1;
  93. if (!ReadConfigFile((string(resPathName) +"/" + configFileName).c_str() ) )
  94. {
  95. return 0;
  96. }
  97. int flagDic = 1;
  98. int flagBig = 1;
  99. pDict = new Dictionary(isExtendedDict, resPathName, flagDic);
  100. pBigram = new Bigram(isBigram, resPathName, flagBig);
  101. if (flagDic==0 || flagBig==0)
  102. {
  103. return 0;
  104. }
  105. if (isPerson)
  106. {
  107. if (!LoadPersonSegRes(resPathName))
  108. return 0;
  109. }
  110. if (isLocation)
  111. {
  112. if (!LoadLocationSegRes(resPathName))
  113. return 0;
  114. }
  115. if (isPOSTag)
  116. {
  117. if (!LoadPOSTagSegRes(resPathName))
  118. return 0;
  119. }
  120. g_isLoadSegRes = true;
  121. return 1;
  122. }
  123. /////////////////////////////////////////////////////////////////////////////////////
  124. /// dll interface function, release the resources.
  125. /////////////////////////////////////////////////////////////////////////////////////
  126. void IRLAS_ReleaseResource()
  127. {
  128. //cout << "ReleaseSegRes" << endl;
  129. if (pDict) {
  130. pDict->releaseMemory();
  131. delete pDict;
  132. // cout << "pDict" << endl;
  133. pDict = 0;
  134. }
  135. if (pBigram) {
  136. delete pBigram;
  137. pDict = 0;
  138. // cout << "pBigram" << endl;
  139. }
  140. for (int i = 0; i < 3; i++)
  141. {
  142. if (pHmm[i])
  143. {
  144. delete pHmm[i];
  145. pHmm[i] = 0;
  146. // cout << i << " : pHmm" << endl;
  147. }
  148. }
  149. g_isLoadSegRes = false;
  150. }
  151. /////////////////////////////////////////////////////////////////////////////////////
  152. /// dll interface function, create a segger. 
  153. /// create a object of the class IRLAS, then return the pointer to this segger.
  154. /////////////////////////////////////////////////////////////////////////////////////
  155. void* IRLAS_CreateSegger()
  156. {
  157. return new CIRLAS(pBigram, pDict);
  158. }
  159. /////////////////////////////////////////////////////////////////////////////////////
  160. /// dll interface function, delete the segger.
  161. /////////////////////////////////////////////////////////////////////////////////////
  162. void IRLAS_ReleaseSegger(void* pSegger)
  163. {
  164. if (pSegger) {
  165. delete (CIRLAS*)pSegger;
  166. }
  167. }
  168. /////////////////////////////////////////////////////////////////////////////////////
  169. /// word segmentation, the core function of IRLAS.
  170. /// why not use this function as the dll interface?
  171. /// because the parameters are in C++ style and don't work in dll.
  172. /////////////////////////////////////////////////////////////////////////////////////
  173. void WordSegment(void* pSegger, string& line, vector<string>& vecWords)
  174. {
  175. if (line.empty()) return;
  176. CIRLAS* irlas = (CIRLAS*)pSegger;
  177. vector<string> wordSequence;
  178. vector<string> tagSequence;
  179. irlas->segger.BasicSegment(line, irlas->graph);
  180. if (isNumTime) 
  181. {
  182. irlas->numtime.NumTimeRecg(irlas->segger.vecAtoms, irlas->graph);
  183. }
  184. if ((isPerson && irlas->isPerson) || (isLocation && irlas->isLocation))
  185. {
  186. irlas->graph.GenerateNBestPath(bestPathNum); 
  187. irlas->segger.AddAtomPath(irlas->graph);
  188. }
  189. if (isPerson && irlas->isPerson)
  190. {
  191. irlas->person.PersonRecg(irlas->graph, irlas->segger.vecAtoms);
  192. }
  193. if (isLocation && irlas->isLocation)
  194. {
  195. irlas->location.LocationRecg(irlas->graph, irlas->segger.vecAtoms);
  196. }
  197. irlas->graph.GenerateNBestPath(1); //best path
  198. irlas->segger.GenerateBestWordSequence(irlas->graph, wordSequence);
  199. if (isPOSTag && irlas->isPOSTag)
  200. {
  201. irlas->postag.POSTagging(irlas->graph, tagSequence); 
  202. for (unsigned int i = 0; i < wordSequence.size(); i++)
  203. {
  204. if (wordSequence[i].find_first_not_of(" tn") != string::npos)//ignore white
  205. vecWords.push_back(wordSequence[i]+"/"+tagSequence[i]);
  206. }
  207. }
  208. else
  209. {
  210. vecWords = wordSequence;
  211. }
  212. }
  213. /////////////////////////////////////////////////////////////////////////////////////
  214. /// dll interface function, it calls the function WordSegment.
  215. /////////////////////////////////////////////////////////////////////////////////////
  216. void IRLAS_WordSegment_dll(void* pSegger, char* str, char** pWord, int& wordNum)
  217. {
  218. string line = str;
  219. vector<string> vecWords;
  220. WordSegment(pSegger, line, vecWords);
  221. wordNum = vecWords.size();
  222. for (int i = 0; i < wordNum; i++)
  223. {
  224. strcpy(pWord[i], vecWords[i].c_str());
  225. pWord[i][vecWords[i].size()] = '';
  226. }
  227. }