词频统计-功能二

一.完成一个小程序

今天的任务是处理一本英文小说。我处理的英文小说是《war and peace》

本想着用多线程来解决的,发现看书还不是太懂,并不能真正动手编程。

我在编程的过程中主要遇到了以下两个问题:

1.在对整个英文小说进行单词总数统计遇见困难。

2.字符串数组的空字符串处理问题。因为我开始用空格来代替标点等不是英文单词来进行对单词分割,其中用到了正则表达式,后来统计对单词出现频数时,发现空格竟然排第一名,有4万多空格。

最终我的处理方式是使用List泛型集合的ForEach方法循环获取非空空字符串。

参考博客链接http://blog.csdn.net/orichisonic/article/details/49334397

这个博主提供了三种处理字符串数组的方法,大家感兴趣,可以学习一下。

我的实现代码如下:

namespace wd
{
    class Program
    {

        //static Dictionary<string, int> result = new Dictionary<string, int>(50000);
        static void Main(string[] args)
        {

            string theBookName;
            Console.Write(">wf  ");
            theBookName = Console.ReadLine();
            string path = @"F:\hello\war_and_peace";
            string[] fs = Directory.GetFiles(path);

            string rline = null;
            foreach (string file in fs)
            {
                rline = ReadFile(file);
                rline = rline.ToLower();
                //使用正则表达式
                //Regex regex = new Regex(@"\b[A-Za-z]+[A-Za-z0-9]*");
                rline=Regex.Replace(rline, @"[^a-zA-Z0-9\u4e00-\u9fa5\s]"," ");
                rline = Regex.Replace(rline, "[[email protected]#$%^&*()`,./;‘:\"<>`?...]"," ");
                string[]S= rline.Split(‘ ‘);
                //使用lambda表达式筛选过滤掉数组中空字符串
                //S = S.Where(S >= !string.IsNullOrEmpty(S)).ToArray();
                //Compute(rline);
                // var outputResult = from KVP in result
                                 //  orderby KVP.Value descending
                                  // select new StringBuilder(KVP.Key).Append(" ").Append(KVP.Value);
                //foreach (var str in outputResult)
                // {
                //   Console.WriteLine(str);

                //}

                /*
                 *使用List泛型集合的ForEach方法循环获取非空空字符串
                 *这里使用了匿名方法
                 */
                List<string> list = new List<string>();
                S.ToList().ForEach(
                (s) =>
                {
                    if (!string.IsNullOrEmpty(s))
                    {
                        list.Add(s);
                    }
                }
                );
                S = list.ToArray();
                Console.WriteLine("total  " + rline.Length + " words");
                Console.WriteLine();
                Hashtable ha = new Hashtable();
                for (int i = 0; i < S.Length; i++)
                {
                    if (ha.ContainsKey(S[i]))
                    {
                        ha[S[i]] = (int)ha[S[i]] + 1;
                    }
                    else
                    {
                        ha.Add(S[i], 1);
                    }
                }
                string[] arrKey = new string[ha.Count];//存哈希表的键
                int[] arrValue = new int[ha.Count];//存哈希表的值
                ha.Keys.CopyTo(arrKey, 0);
                ha.Values.CopyTo(arrValue, 0);
                Array.Sort(arrValue, arrKey);//按哈希表的值进行排序
                wd.Program p = new wd.Program();
                p.ShowArr2(arrKey, arrValue);

                   // Console.ReadKey();

            }
        }

        //读取文件
        private static string ReadFile(string file)
        {
            string readLine;
            FileStream fs = new FileStream(file, FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            readLine = sr.ReadToEnd();
            sr.Close();
            fs.Close();
            return readLine;

        }
        //统计文件中不重复的单词总数及每个单词的词频
        //public void CountEachWord(string arrkey, int arrvalue)
       // {
           // Hashtable ht = new Hashtable();
            //int count = 0;  //单词总数
           // StreamReader streamReader = new StreamReader(arrkey);
           // string line;
           // Regex regex = new Regex(@"\b[A-Za-z]+[A-Za-z0-9]*");
            //while ((line = streamReader.ReadLine()) != null)
          //  {
             //   MatchCollection matchCollection = regex.Matches(line);
              //  foreach (Match word in matchCollection)
             //   {
               //     string words = word.ToString();
                //    if (ht.Contains(words))
                //    {
               //         int j = Convert.ToInt32(ht[words]) + 1;
                 //       ht[words] = j;
                 //   }
                 //   else
                  //  {
                  //      ht.Add(words, 1);
                 //   }
              //  }
          //  }
            //输出单词总数
         //   count = ht.Keys.Count;
           // Console.WriteLine("total  " + count + " words");
      // }

        //输出
        public void ShowArr1(string[] keyArray, int[] valueArray)
        {
            for (int i = keyArray.Length-1; i >=0; i--)
            {
                Console.WriteLine(keyArray[i].ToString().PadRight(15));
                Console.WriteLine(valueArray[i].ToString());
            }
        }
        //
        public void ShowArr2(string[] keyArray, int[] valueArray)
        {
            if (keyArray.Length < 10)
            {
                ShowArr1( keyArray, valueArray);
            }
            else
            {
                int sum = 0;
                for (int j = keyArray.Length - 1; j >=0; j--)
                {
                    Console.Write(keyArray[j].ToString().PadRight(15));
                    Console.WriteLine(valueArray[j].ToString());
                    sum++;
                    if (sum >= 10) break;
                }

            }

        }

    }
}

实现的截图如下:

二.例行报告

1.PSP(personal software process)个人软件过程

类型 任务 开始时间 结束时间 中断时间 净时间
看书 学习多线程和泛型 2017.9.17 10:30 2017.9.17 12:00 90min
编程 写代码 2017.9.17  14:30 2017.9.17 17:00 回复消息5min,厕所10min 2h15min
写作 写随笔 2017.9.17 17:00 2017.9.17 17:30 30min

2.进度条

  代码行 博文字数 知识点
第二周 166 750 见博客词频统计-功能二
时间: 2024-10-02 11:07:47

词频统计-功能二的相关文章

词频统计-功能一

一.完成一个小程序 我 拿到这个题目之后,就决定用最不熟悉的c#来实现,因为老师说不懂的去学才会有进步.布置任务后的第二天就开始去图书馆借了两本书<c#从入门到精髓>,<c#项目实战>,拿到书之后看了入门书<c#从入门到精髓>,看书的过程时痛苦的,因为发现大二选修课学的c#全交还给老师了,只能重头再学了.唯一有点印象的就是窗口应用程序,基于UI的设计. 写代码首先需要工具,由于电脑上没有visual studio的安装包,当时求助了度娘. 如果没有安装包的同学们,可以借

Java实现的词频统计——功能改进

本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的文件名: 3.支持命令行输入存储有英文作品文件的目录名,批量统计: 4.从控制台读入英文单篇作品,重定向输入流. 实现: 1.判断输入方式,如果从命令行传递参数则直接对文件进行统计:如果未传递参数,其方式同控制台相同,由用户从标准输入流输入到文件,再对文件进行词频统计.这里如果传入文件路径时会对其是

201671010416 焦少梅 实验二 词频统计项目

实验二 软件工程个人项目 实验目的与要求 掌握软件项目开发流程 掌握Github上发布软件项目的操作方法. 实验内容和步骤 任务1: 需求分析: 尝试按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发 程序可读入任意英文文本文件,该文件中英文词数大于等于1个. 程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词运行程序的统计功能可显

第二周作业-词频统计

本周作业是词频统计,编程具体要求如下: https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922 对实现功能进行简要的介绍: 功能一:小文件输入,为表明程序能跑.需要在控制台下输入命令,得到文件中不重复的总单词数.并对单词出现的次数进行排序输出. 功能二:支持命令行输入英文作品的文件名,亲自录入,输出显示不重复单词总数,并对出现频率最高的前10的单词进行输出 功能三:支持命令行输入存储有英文作品文件的目录名,批量统计词频. 功能四:

201671030102陈飞 词频统计软件项目报告

我的GitHub仓库 链接 1需求分析 根据实验二 软件工程个人项目分析 1.程序可读入文本文件,且文本文件大小不定,文件路径为相对路径 2.指定单词词频统计功能,可多个输入并且输出柱状图 3.统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt. 4.可按文本中词频数降序显示前k个单词的词频及单词 5.使用java开发,且jdk环境为jdk8u161,jre环境为jre8u161 2功能设计 ·基本功能: 1.指定单词词频统计功能 2.高频词统计功能 3.

201671010454词频统计软件项目报告

一.课程名称:2016级计算机科学与工程学院软件工程(西北师范大学) 二.课程要求:实验二 软件工程个人项目 三.实验目标: (1)掌握软件项目个人开发流程. (2)掌握Github上发布软件项目的操作方法. 四.实验内容: (一)需求分析 程序可读入任意英文文本文件,改文件中英文词数大于等于1个,且能读取容纳英文原版<哈利波特>10万词以上的文章. 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. 高

201671010441徐浩杰 词频统计软件项目报告

实验二.软件工程个人项目 一.需求分析 尝试按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发.软件基本功能要求如下: •程序可读入任意英文文本文件,该文件中英文词数大于等于1个. •程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. •指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. •高频词统计功能:用户从键盘输入高

201671010406 词频统计软件项目报告

一.需求分析 统计文件中各单词的出现次数 二. 功能设计 程序可读入任意英文文本文件,该文件中英文词数大于等于1个. 程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. 高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词. 统计该文本所有单词数量及词频数,并能将单词及词频数按

201671010410 冯婷秀 词频统计软件项目报告

一.需求分析 1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个. 2.程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. 3.指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. 4.高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词. 5.统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件res