TextQuery.cpp
上传用户:cydzxjc
上传日期:2021-11-14
资源大小:2668k
文件大小:8k
源码类别:

STL

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "TextQuery.h"
  3. CTextQuery::CTextQuery(void)
  4. {
  5. memset(this, 0, sizeof(CTextQuery));
  6. }
  7. CTextQuery::~CTextQuery(void)
  8. {
  9. }
  10. void CTextQuery::filter_elements(string felems)
  11. {
  12. filt_elems = felems;
  13. }
  14. void CTextQuery::retrieve_text()
  15. {
  16. string file_name;
  17. cout<<"please enter file name: ";
  18. cin>>file_name;
  19. ifstream infile(file_name.c_str(), ios::in);
  20. if (!infile)
  21. {
  22. cerr<<"oops! unable to open file "
  23. <<file_name<<" -- bailing out!n";
  24. exit(-1);
  25. }
  26. else
  27. {
  28. cout<<"n";
  29. }
  30. lines_of_text = new vector<string>;
  31. string textline;
  32. while (getline(infile, textline, 'n'))
  33. {
  34. lines_of_text->push_back(textline);
  35. }
  36. }
  37. void CTextQuery::separate_words()
  38. {
  39. vector<string> *words = new vector<string>;
  40. vector<location> *locations = new vector<location>;
  41. for (short line_pos = 0; line_pos < lines_of_text->size(); line_pos++)
  42. {
  43. short word_pos = 0;
  44. string textline = (*lines_of_text)[line_pos];
  45. string::size_type eol = textline.length();
  46. string::size_type pos = 0, prev_pos = 0;
  47. while((pos = textline.find_first_of(' ', pos)) != string::npos)
  48. {
  49. words->push_back(textline.substr(prev_pos, pos - prev_pos));
  50. locations->push_back(make_pair(line_pos, word_pos));
  51. word_pos++;
  52. pos++;
  53. prev_pos = pos;
  54. }
  55. words->push_back(textline.substr(prev_pos, pos - prev_pos));
  56. locations->push_back(make_pair(line_pos, word_pos));
  57. }
  58. text_locations = new text_loc(words, locations);
  59. }
  60. void CTextQuery::filter_text()
  61. {
  62. if (filt_elems.empty())
  63. {
  64. return;
  65. }
  66. vector<string> *words = text_locations->first;
  67. vector<string>::iterator iter = words->begin();
  68. vector<string>::iterator iter_end = words->end();
  69. while (iter != iter_end)
  70. {
  71. string::size_type pos = 0;
  72. while ((pos = (*iter).find_first_of(filt_elems, pos)) != string::npos)
  73. {
  74. (*iter).erase(pos, 1);
  75. }
  76. ++iter;
  77. }
  78. }
  79. void CTextQuery::suffix_text()
  80. {
  81. vector<string> *words = text_locations->first;
  82. vector<string>::iterator iter = words->begin();
  83. vector<string>::iterator iter_end = words->end();
  84. while (iter != iter_end)
  85. {
  86. if ((*iter).size() <= 3)
  87. {
  88. iter++;
  89. continue;
  90. }
  91. if ((*iter)[(*iter).size() - 1] == 's')
  92. {
  93. suffix_s(*iter);
  94. }
  95. //其他的后缀处理放在这里
  96. iter++;
  97. }
  98. }
  99. void CTextQuery::suffix_s(string &word)
  100. {
  101. string::size_type spos = 0;
  102. string::size_type pos3 = word.size() - 3;
  103. //"ous", "ss", "is", "ius"
  104. string suffixes("oussisius");
  105. if (!word.compare(pos3, 3, suffixes, spos, 3) ||
  106. !word.compare(pos3, 3, suffixes, spos + 6, 3) ||
  107. !word.compare(pos3 + 1, 2, suffixes, spos + 2, 2) ||
  108. !word.compare(pos3 + 1, 2, suffixes, spos + 4, 2))
  109. {
  110. return;
  111. }
  112. string ies("ies");
  113. if (!word.compare(pos3, 3, ies))
  114. {
  115. word.replace(pos3, 3, 1, 'y');
  116. return;
  117. }
  118. string ses("ses");
  119. if (!word.compare(pos3, 3, ses))
  120. {
  121. word.erase(pos3 + 1, 2);
  122. return;
  123. }
  124. //去掉尾部的's'
  125. word.erase(pos3 + 2);
  126. //watch out for "'s"
  127. if (word[pos3 + 1] == ''')
  128. {
  129. word.erase(pos3 + 1);
  130. }
  131. }
  132. //大写转小写
  133. void CTextQuery::strip_caps()
  134. {
  135. vector<string> *words = text_locations->first;
  136. vector<string>::iterator iter = words->begin();
  137. vector<string>::iterator iter_end = words->end();
  138. string caps("ABCDEFGHIGKLMNOPQRSTUVWXYZ");
  139. while (iter != iter_end)
  140. {
  141. string::size_type pos = 0;
  142. while ((pos = (*iter).find_first_of(caps, pos)) != string::npos)
  143. {
  144. (*iter)[pos] = tolower((*iter)[pos]);
  145. }
  146. ++iter;
  147. }
  148. }
  149. void CTextQuery::build_word_map()
  150. {
  151. word_map = new map<string, loc*>;
  152. set<string> exclusion_set;
  153. /*string file_name = "exclusion_set.txt";*/
  154. /*basic_streambuf<char *, char_traits<char *>> *strBuf;
  155. basic_istream<char *, char_traits<char *>> infile(strBuf);*/
  156. ifstream infile("exclusion_set");
  157. if (!infile)
  158. {
  159. static string default_excluded_words[25] = {
  160. "the", "and", "but", "that", "then", "are", "been",
  161. "can", "can't", "cannot", "could", "did", "for",
  162. "had", "have", "him", "his", "her", "its", "into",
  163. "were", "which", "when", "with", "would"};
  164. cerr<<"warning! unable to open word exclusion file! --"
  165. <<"using default setn";
  166. copy(default_excluded_words, default_excluded_words + 25,
  167. inserter(exclusion_set, exclusion_set.begin()));
  168. }
  169. else
  170. {
  171. //istream_iterator<string, diff_type> input_set/*(infile)*/, eos;
  172. //copy(input_set, eos, inserter(exclusion_set, exclusion_set.begin()));
  173. }
  174. //遍历单词,输入键/值对
  175. vector<string> *text_words = text_locations->first;
  176. vector<location> *text_locs = text_locations->second;
  177. register int elem_cnt = text_words->size();
  178. for (int ix = 0; ix < elem_cnt; ++ix)
  179. {
  180. string textword = (*text_words)[ix];
  181. if (textword.size() < 3 || exclusion_set.count(textword))
  182. {
  183. continue;
  184. }
  185. if (!word_map->count((*text_words)[ix]))
  186. {
  187. //没有,添加
  188. loc *ploc = new vector<location>;
  189. ploc->push_back((*text_locs)[ix]);
  190. word_map->insert(val_Type((*text_words)[ix], ploc));
  191. }
  192. else
  193. {
  194. (*word_map)[(*text_words)[ix]]->push_back((*text_locs)[ix]);
  195. }
  196. }
  197. }
  198. void CTextQuery::query_text()
  199. {
  200. string que_text;
  201. do 
  202. {
  203. cout<<"enter a word against which to search the text.n"
  204. <<"to quit, enter a single character ==> ";
  205. cin>>que_text;
  206. if (que_text.size() < 2)
  207. {
  208. break;
  209. }
  210. string caps("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  211. string::size_type pos = 0;
  212. while ((pos = que_text.find_first_of(caps, pos)) != string::npos)
  213. {
  214. que_text[pos] = tolower(que_text[pos]);
  215. }
  216. //如果对map索引,输入que_text,如无
  217. //说明没有要找的词
  218. if (!word_map->count(que_text))
  219. {
  220. cout<<"]nSorry. There are no enteries for "
  221. <<que_text<<".nn";
  222. continue;
  223. }
  224. loc *ploc = (*word_map)[que_text];
  225. set<short> occurrence_lines;
  226. loc::iterator liter = ploc->begin(), liter_end = ploc->end();
  227. while (liter != liter_end)
  228. {
  229. occurrence_lines.insert(occurrence_lines.end(), (*liter).first);
  230. ++liter;
  231. }
  232. register int size = occurrence_lines.size();
  233. cout<<"n"<<que_text<<"noccurs"<<size<<(size == 1 ? " time: " : " times: ")<<"nn";
  234. set<short>::iterator it = occurrence_lines.begin();
  235. for (; it != occurrence_lines.end(); ++it)
  236. {
  237. int line = *it;
  238. //不要用从0开始有问本行把用户弄迷糊了
  239. cout<<"t( line"<<line + 1<<" ) "<<(*lines_of_text)[line]<<endl;
  240. }
  241. cout<<endl;
  242. while (!que_text.empty());
  243. cout<<"Ok, bye!n";
  244. }
  245. void CTextQuery::display_map_text()
  246. {
  247. map_text::iterator iter = word_map->begin(), iter_end = word_map->end();
  248. while (iter != iter_end)
  249. {
  250. cout<<"word: "<<(*iter).first<<" (";
  251. int loc_cnt = 0;
  252. loc *text_locs = (*iter).second;
  253. loc::iterator liter = text_locs->begin(), liter_end = text_locs->end();
  254. while (liter != liter_end)
  255. {
  256. if (loc_cnt)
  257. {
  258. cout<<",";
  259. }
  260. else
  261. {
  262. ++loc_cnt;
  263. }
  264. cout<<"("<<(*liter).first<<","<<(*liter).second<<")";
  265. ++liter;
  266. }
  267. cout<<")n";
  268. ++iter;
  269. }
  270. cout<<endl;
  271. }
  272. void CTextQuery::display_text_locations()
  273. {
  274. vector<string> *text_words = text_locations->first;
  275. vector<location> *text_locs = text_locations->second;
  276. register int elem_cnt = text_words->size();
  277. if (elem_cnt != text_locs->size())
  278. {
  279. cerr<<"oops! internal error: word and position vectors "
  280. <<"are of unequal sizen"
  281. <<"words: "<<elem_cnt<<" "
  282. <<"locs: "<<text_locs->size()
  283. <<" -- bailing out!n";
  284. exit(-2);
  285. }
  286. for (int ix = 0; ix < elem_cnt; ix++)
  287. {
  288. cout<<"word: "<<(*text_words)[ix]<<"t"
  289. <<"location: ("
  290. <<(*text_locs)[ix].first<<","
  291. <<(*text_locs)[ix].second<<")"
  292. <<"n";
  293. }
  294. cout<<endl;
  295. }