• 数学之美读书笔记与感悟(一)


      之前看网上很多人推荐《数学之美》这本书,因为书名有数学二字,尽管有很多人说内容基本是科普性质,但心中总是总是有畏难情绪(博主是数学渣),最近因为公司工作偏向爬虫方向,自己又在研究machine learning,恰巧看到此书内容与爬虫,搜索引擎,自然语言处理内容相关,就买了一本,谁成想一读就对书中内容着迷了,遂写下此博客。

         首先,我想告诉那些和博主同样对数学苦大仇深的同学们,完整掌握这本书的内容确实需要一定的数学背景,但作者很巧妙的将这些'高深'的东西作为补充内容,对理解大多数概念并无阻碍,另外,此书虽名为数学之美,更多的是探讨数学在实际生产(尤其是NLP)中的应用。

    一.自然语言处理

        "任何一种语言都是一种编码的方式,而语法规则是编解码的算法",事实上,在我看来,这个概念在自然语言处理中用的到,在计算机网络中亦然,发送方将信息从上至下各层进行编码,接收方收到消息之后层层解码。类比到自然语言中,人们试图使机器拥有智能,理解人类语言。

        在自然语言处理发展之初,人们试图用电脑来模拟人脑,而当时人们处理句子通常是通过类似于编程语言编译器那样经过词法分析,语法分析最后得到一个抽象语法树,而我们的高级编程语言通常语法很简单(相对于自然语言来说),而且是基于上下文无关文法的。所以这种基于文法规则的方式在面对复杂句时就显得乏力了。在这种思路失败后,后来的自然语言处理完全是基于数学/统计学上的。(果然数学才是王道啊)。

        在这里一个简单的例子说明基于规则方式的难处:一句简单的英语:The box is in the pen,事实上,这里的pen是围栏的意思,但计算机却很难理解一词多义的概念。

    二.统计语言模型

       既然自然语言处理从规则过渡到统计,那么必须对其进行数学建模,即本章提到的统计语言模型。

       一个句子是否正确,在统计语言模型中,需要看它出现的可能性有多大:

                   假设S是一个有意义的句子,由一系列词组成:w1,w2....wn (n=S.length),那么首先第一种方式可以看S在所有文本(即历史上所有语言)中出现的可能性:P(S),但这           显然不可能。另一种方式是我们将P(S)展开,P(S)=P(w1,w2,...,wn),根据条件概率,可以得出:P(S)=P(w1)*P(w2|w1)*P(w3|w1,w2)....P(wn|w1,w2...wn-1)。

              但这种方式计算条件概率越靠后的词计算复杂度越高,怎么办?这里就用到了马尔科夫假设,一个词出现的概率只和它之前的词有关,即P(S)=P(w1)...P(wn|wn-1)。

              当然也可以假设一个词和前面的N-1个词相关。

        现在,根据条件概率公式,可知P(wi|wi-1) = P(wi-1,wi)/p(wi-1), 我们可以通过计算相对频度得到概率(根据大数定理), P(wi|wi-1) = #(wi-1,wi)/#(wi-1)。(分子表示wi-1和wi前后相邻在语料库中出现的次数,分母表示wi-1在语料库中出现的次数)。

        事实上,一个词出现的概率不可能只和它前面的词有关,这就引出了高阶语言模型的概念,我们可以假设一个词和前面N-1个词相关,这就是N-1阶马尔科夫假设,当N=1时,显然就是一个上下文无关的模型。

    三.中文分词

      英语中词之间存在天然的分解符,而中文则不然,所以需要先对句子分词,再使用语言处理模型。最简单的中文分词法是查字典,从左至右扫描句子,遇到词典中有的词就标识

    出来,复合词查找最长匹配,如果字典中没有的字串就分割成单字。

         并非所有的句子都能使用最长正向匹配,中文分词同样可以使用上文的统计语言模型进行分词,假设一句话有几种分词方式,那么最好的一种应该确保分词后这个句子出现的概率最大,而这种方式同样可以用在手写体识别中,因为手写单词之间空格不清晰,中文分词法可以帮助确定单词边界。

       另外,不同应用应该有不同的分词粒度,机器翻译中,分词粒度最好大一些,比如‘联想公司’作为整体可以很容易找到单词Lenovo,而搜索中,分词粒度最好小一些,比如清华大学这个词,如果作为一个词的话,用户输入清华时则获取不到清华大学的信息。

      

       

        

       

  • 相关阅读:
    Nacos配置失败(java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all server)
    数据库事务
    Consider defining a bean of type 'redis.clients.jedis.JedisPool' in your configuration.
    Mybatis+SpringBoot 项目All elements are null
    docker安装Sentinel
    docker安装nacos
    Docker 配置 Seata 集成 Nacos
    mybatis转义反斜杠_MyBatis Plus like模糊查询特殊字符_、、%
    在linux上配置Maven环境变量
    spring cache 学习——整合 redis 实现声明式缓存配置
  • 原文地址:https://www.cnblogs.com/showing/p/6753044.html
Copyright © 2020-2023  润新知