统计文章中单词出现的次数

      最近看到一本好书《C++ Cookbook》,不是C++语言入门教程,是一本关于c++程序设计日常问题的珍贵解决方案。里面的收集了大量C++比较现实的问题解决方案,如数字计算、日期和时间、字符串和文本操作、多线程和数学编程等等,并且还介绍了Boost库(里面有些问题解决也是用这个库)。里面讲的问题都比较实际,代码实现也很规范,不过也有些问题偏简单,在之前学习语言就知道了。

 

 

 

     举其中的一个例子,如果要统计文章中单词的次数问题,书中是用STL库中的map来实现的,感觉写的比较简洁,自己修改了一下代码如下:

     解决方案

//统计文本文件中每个单词的出现次数

#include <iostream>
#include <map>
#include <string>
#include <fstream>
using namespace std;

typedef map<string,int> StrIntMap;

void CountWords(istream& in, StrIntMap& words)
{
string s;
while(in >> s )
{
   ++words[s];
}
}

int main()
{
ifstream in("in.txt");
StrIntMap w;

CountWords(in, w);

for(StrIntMap::iterator p = w.begin(); p != w.end(); ++p)
{
   cout << p->first << " occured " << p->second << " times." <<endl;
}
   return 0;
}

     问题存在:

      但是这个解决方案也存在问题,就是没对单词进行判断,如文件中有“I love this game.” , 程序运行结果是 “game.” 算一次,单词后面的句号也被当成单词的一部分。后来网上查看了些相关资料,大多是用hash table来实现,但也有些问题出现。
例如符号问题: "Jack's book." 中 的 Jack's 算是单词吗?我觉得Jack 才算?。
例如语法问题(词的变化形式,包括复数、不规则、过去分词、现在分词、比较级和最高级):“It's getting warmer.” 中 It's 算是单词吗? 我觉得是 It 和 is;还有getting 和 warmer 应该算进 原形的 get 和 warm 中呢还是 另外算。
网上很多资料都是不把语法问题考虑进去,而符号问题是把符号当成空格处理(Jack's 就会有 Jack:1次, s: 1次)。不过有个国内软件“英语词频统计2.7”,好像有解决语法问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值