以大数据眼光欣赏唐人文墨(二)代码实现

Begin

继上次对唐诗三百首和全唐诗四万多首诗进行分析之后…

详细内容可以看看上次这篇文章,《以大数据眼光欣赏唐人文墨(一)》

这篇文章来讲讲具体的代码实现,本项目全部采用C#编写。

软件介绍

首先为了做本次分析,我用C#写了一个Winform程序,名字很逗比,叫做“我爱读诗词——唐诗”。

软件和唐诗三百首数据文件打包下载:http://pan.baidu.com/s/1gftDKTd

全唐诗数据由于太大了需要下载的同学点这个:http://pan.baidu.com/s/1nv4WNNF

下面是软件截图:

启动直接写成控制台的,反正就是自己用而已,粗糙一点无所谓,能用就行。

唐诗三百首匹配界面截图:

这里是从源文件读取数据并整理出每一首诗的标题、作者、内容。

全唐诗的匹配的界面:

你问我为什么这个的背景是深色的,我也不知道(摊手,反正当时就这么设置了= =…

由于全唐诗太多了,要打开并分析出来需要很长时间,所以这里用了小容量样本。

分析界面:

这个就是上次的文章里展示的,主要功能都在这里了。窗口主体是一个listview控件,用来分类显示分析结果。

代码

关于从源文件整理出标题、作者、内容的代码,请参见  用C#学习唐诗三百首和全唐诗

标题分析

首先是从数据文件里读取出每一首诗

QData qD = new QData(poemFile);

定义一个 Dictionary<string, int> 结构,索引是标题,值是数量。

分析很简单,从QData对象读取出所有的标题然后判断是否在 Dictionary<string, int> 存在这个标题,如果存在数量就+1,如果不存在就添加进去。

代码如下:

string[] sections = qD.GetAllSectionsArray();
Console.WriteLine("共有[{0}]首诗", sections.Length);
foreach (string s in sections)
{
    Application.DoEvents();
    string title = qD.GetValue(s, "Title");
    this.lblStatus.Text = (++count).ToString();
    if (title.Length > 0)
    {
        if (poemTitle.ContainsKey(title))
            poemTitle[title]++;
        else
            poemTitle.Add(title, 1);
    }
}

然后再对 Dictionary<string, int>  排序:

var poemTitleSorted = from pObj in poemTitle orderby pObj.Value descending select pObj;

Linq语句用起来太方便了。

然后把排序的结果添加到Listview就OK了~

作者分析

和标题分析是大同小异的,这里不再累述。

单字分析

先贴出代码了,思路很简单,就是提取出所有内容,拆分出每个字,再去掉标点符号,和标题分析一样进行统计。

Dictionary<char, int> poemChar = new Dictionary<char, int>();
string poemFile = this.txtFile.Text;
QData qD = new QData(poemFile);
int count = 0;
long charCount = 0;
if (File.Exists(poemFile))
{
    string[] sections = qD.GetAllSectionsArray();
    Console.WriteLine("共有[{0}]首诗", sections.Length);
    foreach (string s in sections)
    {
        Application.DoEvents();
        string content = qD.GetValue(s, "Content");
        this.lblStatus.Text = (++count).ToString();
        charCount += content.Length;

        foreach (char c in content)
        {
            if (poemChar.ContainsKey(c))
                poemChar[c]++;
            else
                poemChar.Add(c, 1);
        }
    }

    Console.WriteLine("共有[{0}]字", charCount);

    if (poemChar.ContainsKey(‘,‘))
        poemChar.Remove(‘,‘);
    if (poemChar.ContainsKey(‘。‘))
        poemChar.Remove(‘。‘);
    if (poemChar.ContainsKey(‘!‘))
        poemChar.Remove(‘!‘);
    if (poemChar.ContainsKey(‘?‘))
        poemChar.Remove(‘?‘);
    if (poemChar.ContainsKey(‘[‘))
        poemChar.Remove(‘[‘);
    if (poemChar.ContainsKey(‘]‘))
        poemChar.Remove(‘]‘);
    if (poemChar.ContainsKey(‘-‘))
        poemChar.Remove(‘-‘);

    Console.WriteLine("去除重复之后共有 {0} 字", poemChar.Count);

    var poemTitleSorted = from pObj in poemChar orderby pObj.Value descending select pObj;  //Linq排序

    this.listView.Clear();
    this.listView.Columns.Add("单字", 200);
    this.listView.Columns.Add("单字数量", 100);
    this.listView.Columns.Add("比例", 100);
    this.listView.BeginUpdate();
    foreach (KeyValuePair<char, int> p in poemTitleSorted)
    {
        double ratio = (double)p.Value / (double)charCount * 100;
        ListViewItem item = new ListViewItem(new string[] { p.Key.ToString(), p.Value.ToString(), ratio.ToString("F5") + "%" });
        this.listView.Items.Add(item);
    }
    this.listView.EndUpdate();
}
qD.Close();

诗句长度分析

一样贴出代码。思路是提取每首诗的内容之后,按标点符号拆分,我这里针对逗号、句号、问号和感叹号拆分,然后就能获取每个诗句的长度了。用Linq排个序就好了。

string poemFile = this.txtFile.Text;
Dictionary<string, int> poemType = new Dictionary<string, int>();
QData qD = new QData(poemFile);
int count = 0;

if (File.Exists(poemFile))
{
    string[] sections = qD.GetAllSectionsArray();
    Console.WriteLine("共有[{0}]首诗", sections.Length);
    foreach (string s in sections)
    {
        Application.DoEvents();
        string content = qD.GetValue(s, "Content");
        this.lblStatus.Text = (++count).ToString();

        int comma = content.IndexOf(‘,‘);
        int period = content.IndexOf(‘。‘);
        int questionMark = content.IndexOf(‘?‘);
        int exclamationPoint = content.IndexOf(‘!‘);

        comma = comma < 0 ? (period < 0 ? (questionMark < 0 ? exclamationPoint : questionMark) : period) : comma;
        period = period < 0 ? comma : period;
        questionMark = questionMark < 0 ? comma : questionMark;
        exclamationPoint = exclamationPoint < 0 ? comma : exclamationPoint;

        int min = comma < period ? comma : period;
        min = min < questionMark ? min : questionMark;
        min = min < exclamationPoint ? min : exclamationPoint;
        min = min < 0 ? 0 : min;

        string wordsOfFirst = content.Substring(0, min).Length.ToString();

        content = NumberToChinese(wordsOfFirst) + "言";
        if (content.Length > 0)
        {
            if (poemType.ContainsKey(content))
                poemType[content]++;
            else
                poemType.Add(content, 1);
        }
    }
}

var poemTitleSorted = from pObj in poemType orderby pObj.Value descending select pObj;  //Linq排序

this.listView.Clear();
this.listView.Columns.Add("句子长度", 200);
this.listView.Columns.Add("数量", 100);
this.listView.Columns.Add("比例", 100);
this.listView.BeginUpdate();
foreach (KeyValuePair<string, int> p in poemTitleSorted)
{
    double ratio = (double)p.Value / (double)count * 100;
    ListViewItem item = new ListViewItem(new string[] { p.Key, p.Value.ToString(), ratio.ToString("F4") + "%" });
    this.listView.Items.Add(item);
}
this.listView.EndUpdate();
qD.Close();

End

实现的核心代码基本就这些了,没有多少代码,我对C#不是很熟悉,代码写得比较冗长,请大家多多指教。

我的微信公众号:DealiAxy

时间: 2024-12-10 14:21:50

以大数据眼光欣赏唐人文墨(二)代码实现的相关文章

大数据之道 HMM系列&lt;二&gt;(成长)

一:HMM解码问题 (1)编程深处无非就是算法和结构,以及各种架构和版本的管理(如Git管理),因此作为程序员算法这一关是绕不过去的: (2)关于算法,个人比较崇尚的一本书是<算法导论>和ACM实战系类的算法培训: (3)对于自然语言处理领域或者部分机械学习领域的算法,HMM模型是非常经典的算法之一,非常适合初学者学习和研究: (4)HMM模型μ=(A,B,π),的状态是不可见的,我们看到的仅仅是状态表现出来的观察值和状态概率函数. 二:HMM简介(u = {N,M,A,B,pai} ---&

mysql大数据备份与还原(二)

mysql大数据备份和增量备份及还原 Xtrabackup实现是物理备份,而且是物理热备 目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup :ibbackup是需要授权价格昂贵,而xtrabackup功能比ibbackup强大而且是开源的 Xtrabackup提供了两种命令行工具: xtrabackup:专用于备份InnoDB和XtraDB引擎的数据: innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令可以实现备份InnoDB,

大数据架构和模式(二)——如何知道一个大数据解决方案是否适合您的组织

简介 在确定投资大数据解决方案之前,评估可用于分析的数据:通过分析这些数据而获得的洞察:以及可用于定义.设计.创建和部署大数据平台的资源.询问正确的问题是一个不错的起点.使用本文中的问题将指导您完成调查.答案将揭示该数据和您尝试解决的问题的更多特征. 尽管组织一般情况对需要分析的数据类型有一些模糊的理解,但具体的细节很可能并不清晰.毕竟,数据可能具有之前未发现的模式的关键,一旦识别了一种模式,对额外分析的需求就会变得很明显.要帮助揭示这些未知的未知信息,首先需要实现一些基本用例,在此过程中,可以

大数据架构和模式(二)如何知道一个大数据解决方案是否适合您的组织

本文收藏于http://kb.cnblogs.com/page/510979/ 作者: Divakar等  来源: DeveloperWorks  发布时间: 2015-01-29 18:20  阅读: 1542 次  推荐: 0   原文链接   [收藏] 摘要:本文介绍一种评估大数据解决方案的可行性的基于维度的方法.通过回答探索每个维度的问题,您可以通过自己对环境的了解来确定某个大数据解决方案对您是否适合.仔细考虑每个维度,就会发现有关是否到了改进您的大数据服务的时候的线索. 简介 在确定投

Java转职大数据人群常使用的二十多个大数据工具

最近我问了很多Java开发人员关于最近12个月内他们使用的是什么大数据工具. 这是一个系列,主题为: 语言 web框架 应用服务器 SQL数据访问工具 SQL数据库 大数据 构建工具 云提供商 今天我们就要说说大数据.根据维基百科,大数据是数据集的一个广义的术语,并且该数据集是如此庞大和复杂,以致于传统的数据处理应用程序无法胜任. 在许多情况下,使用SQL数据库用于存储/检索数据就足够了.但在另一些情况下,要么SQL数据库规模不够,要么还有更好的工具.这一切都取决于使用情况. 现在让我们来讨论一

大数据热词科普(二)

在上一篇文章中我们给大家介绍了大数据的部分热词科普--人工智能.区块链.图灵测试.在这篇文章中我们给大家介绍一下涉及到大数据的回归分析.贪婪算法.MapReduce.数据挖掘.希望这些知识能够给大家带来帮助. 首先我们说的是回归分析,回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法.运用十分广泛,回归分析按照涉及的变量的多少,分为一元回归和多元回归分析:按照因变量的多少,可分为简单回归分析和多重回归分析:按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析.

第一家关店的盒马鲜生,大数据眼光看新零售的转型之路

4月30日,盒马鲜生宣布昆山新城吾悦广场店,将于2019年5月31日起停止营业.从2016年初开出第一家店一年半的时间盒马鲜生全球门店64家,覆盖14个城市.据华商韬略的分析称"随着模式的日益成熟,盒马新店实现盈利的周期也大幅缩短,广州开的门店当月就实现了盈利.按照年底前增加到100家店的计划,盒马将进入全面规模化盈利期." 很多人都无比看好盒马式的新零售,认为这一模式通过大数据把台前幕后的系统融合在一起,把"人""货""场"

大数据:Spark Shuffle(二)Executor、Driver之间Shuffle结果消息传递、追踪

1. 前言 在博客里介绍了ShuffleWrite关于shuffleMapTask如何运行,输出Shuffle结果到文件Shuffle_shuffleId_mapId_0.data文件中,每个executor需要向Driver汇报当前节点的Shuffle结果状态,Driver保存结果信息进行下个Task的调度. 2. StatusUpdate消息 当Executor运行完Task的时候需要向Driver汇报StatusUpdate的消息 override def statusUpdate(tas

大数据:Spark Core(二)Driver上的Task的生成、分配、调度

1. 什么是Task? 在前面的章节里描述过几个角色,Driver(Client),Master,Worker(Executor),Driver会提交Application到Master进行Worker上的Executor上的调度,显然这些都不是Task. Spark上的几个关系可以这样理解: Application: Application是Driver在构建SparkContent的上下文的时候创建的,就像申报员,现在要构建一个能完成任务的集群,需要申报的是这次需要多少个Executor(可