数学之美第二章读后感 自然语言处理从规则到统计的演变 及 个人新学期代码规范

、  这是一份算法课的作业,要求是阅读吴军博士所著的《数学之美》其中一章并写下读后感。

以前我曾经阅读过吴军的《浪潮之巅》,被计算机发展的历史和时代浪潮所震撼,《数学之美》其实我也有一本,只不过我借给师弟了,趁此机会重新阅读一下。

第二章主要描写了自然语言处理的发展历程。作者首先从语言本身讲起,用句法规则拆解了一些简单的句子,说明基于规则的语言处理是可以进行的,然而当我们使用一些成分复杂的句子以及一些多义词(需联系上下文才能得出具体含义),我们才知道,单是令计算机使用句法规则和词语意思,需要绘制一张规模很大的有向图,并且翻译处理的结果也差强人意。来看一个例子:

The pen is in the box.

The box is in the pen.

第二句话,如果英语是母语的人会很好理解,pen翻译成围栏即可。然而,生活中存在着大量类似的句子,更不用说当这种句子的成分趋于复杂的时候了。这就说明了19世纪坚持使用规则的一派人去进行语言处理的弊端--规则有时不能准确地处理词语与词语之间的联系,而仅仅是一个准则。

在计算机算力蓬勃发展后,计算机的统计能力也大幅提升,使用统计方法进行大量的数据收集,再进行语言处理,这样的结果是否会越来越好呢?答案是肯定的。最终,采用统计方法的谷歌翻译打败了基于规则处理的SysTran系统。

在不断发展的过程中,我注意到许多科学家在此领域做出了很多杰出的贡献,然而,在基于规则进行语言处理领域深耕的科学家在数十年的耕耘中所获甚少。走向了一条错误的路,直至被统计打败,研究员在这一过程中其实还是很难改变自己的观点,因为沉没成本太高了。历史上,这样的试错和歧途数不胜数,当研究错误方向的科学家全面退下,迎接这个世界的,有可能是另一条错误的道路,但更多的是一条正确的坦途。

数学与统计的方法与发展了数千年的自然语言交织,得益于计算机的发展,希望从此以后关于数学的课程我都能好好学习,不要偏科(我英语还不错),短短一章即可令人感叹数学之强大。

个人代码规范

说到代码规范,我就想起一个很有意思的东西,在github上有一个教你怎么写出垃圾代码的帖子。

state-of-the-art-shitcodehttps://github.com/trekhleb/state-of-the-art-shitcode

除此之外,我还看了一些谷歌、阿里等公司写的,长篇大论的,项目也多,暂时就不说这么多了,就谈谈做题用的吧。其实就是与之相反,要写出好的代码,我不禁回忆起上学年初学c++时,我喜欢用一些比较好理解的英文名字来命名我的变量,却经常遭到其他同学的鄙视:你起个abc不就好了!其实我只想把我引以为豪的英语用上用好一点,没想到却成了一个好习惯,哈哈哈。

1.变量命名

变量命名的准则:与题目或项目所给的变量一致,或者能够准确判断变量名所指对象。

例如:输入若干个整数,整数变量我们不妨起名为:integer.

           输出一个值:value 一个临时变量:temp.

除此之外,不以下划线美元符号等字符作为首字符命名变量。

2.代码规整

import java.math.BigDecimal;
import java.util.Scanner;
public class Exercise2_13 {
    public static void main(String[] args){
        double amount;
        double value;
        Scanner input = new Scanner(System.in);
        System.out.print("Enter the monthly saving amount:");
        amount= input.nextDouble();
        value= (double) (amount*(1+0.00417));
        for(int i=0;i<5;i++)
        {
            value= (double) ((amount+value)*(1+0.00417));
        }
        BigDecimal d = new BigDecimal(value);
        value = d.setScale(2,BigDecimal.ROUND_DOWN).doubleValue();
        System.out.println("After the sixth month, the account value is $"+ String.format("%.2f",value));
    }
}

这是java基础第11版的2-13题,题目要求输入一个账户每月的进账金额,并给定一个利率,要你输出6个月后账户的余额,可以看到变量都很清楚。代码需要规整分布,而不是全部挤在一行或者花括号分离。

3.写注释

上文中的代码基本上初学者都看得懂,只不过使用的BigDecimal d的作用可能需要标明。

import java.math.BigDecimal;//直接保留小数点后位数所使用的包
import java.util.Scanner;
public class Exercise2_13 {
    public static void main(String[] args){
        double amount;
        double value;
        Scanner input = new Scanner(System.in);
        System.out.print("Enter the monthly saving amount:");
        amount= input.nextDouble();
        value= (double) (amount*(1+0.00417));
        for(int i=0;i<5;i++)
        {
            value= (double) ((amount+value)*(1+0.00417));
        }
        BigDecimal d = new BigDecimal(value);//使用BigDecimal d承接我们要输出的账户余额
        value = d.setScale(2,BigDecimal.ROUND_DOWN).doubleValue();//直接保留两位小数
        System.out.println("After the sixth month, the account value is $"+ String.format("%.2f",value));
    }
}

这样一来,抄作业的同学就看得更明白了,这个同学以后有可能是我们的同事。

4.不要保留没有用的代码,以及无法执行的语句!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值