2014年10月16日星期四

初识中文分词(一)MMSEG - carrotH

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
初识中文分词(一)MMSEG - carrotH  阅读原文»

第一次记录一些学习的内容,希望能给和我一样不熟悉中文分词的人一些思路。(写的不好,还请见谅)

=====================背景======================

中文分词的学习是想要给公司其他部门的人做一个简介,让不知道中文分词的人有个初步的认识,而我作为一个完全不懂的人要给其他不懂的人做这个讲解 ⊙�⊙b 估计是希望我以一个同样的不知道什么是中文分词算法的人来讲解这个,这样能更贴近听者的感受吧。

硬着头皮看看写写6天多终于有一个我自己还算满意的PPT出山了。

进入正题

=================看这边~我就是正题==================

其实在之前稍微了解了一点关于中文分词的思想,但是对于已经成型的中文分词器的主流思想还是不甚了解,从搜索引擎处找到了开源中国的中文分词库。一眼看上去是几十个分词器列了出来,但其实每个分词器点进去并不会有很长的介绍,基本都是给出来使用的分词算法、一些自有的特点、百分比数据等。稍微聚合一下就会发现,实际使用的分词算法两只手就能数的过来,而算法背后的模型又是可以聚合的\(^o^)/,大致看过两遍后心里就有数了。

我到现在看到的中文分词器,基本都是这三类的任意组合,一般来说,只使用其中一种思想的分词器效果基本无法达到比较理想的分词效果。而在这些组合中,又以前两种的组合居多,这可能也与第三种方法本身的研究进展和难度系数相对较高有关。

  • 第一种思想——基于词典:基于这种思想按照常用的说法也叫机械分词,基本上不太考虑文本本身要表达的含义,只是一个个找到词典中与之匹配的词语进行划分,所以这种方法基本上只是作为分词的前期处理。
  • 第二种思想——基于统计:基于这种思想的已经是经过了对分词这个实际的需求的数学建模、求解的一个过程,而无论是建模还是求解所用的算法,其实每一个问题都可以作为一个专门的课题写个论文,不信你可以拿这些关键字去论文网搜一搜。
  • 第三种思想——基于规则:在我看来,这个有点类似于人工智能一类了,建立一个系统来学习模仿人类是如何去分析一句话并如果对这句话的划分,甚至于可以添加一些标记来表示一句话当中所包含的情感。

在大概6天的时间里,我只是粗粗的理解了下两种算法:MMSeg和Viterbi。下面就主要是对这两种算法的一个思路的简介,如果有理解错误的地方还请大神指点我一下,不胜感激�( ̄� ̄)�

强势插入: 鉴于Viterbi的那部分我觉得放在一起这篇就会过长,暂定放在下一篇细聊 \(^o^)/ 希望能继续关注!谢谢!

MMSeg

这个算法分词结果能满足很大一部分需求不是特别高的场合,最关键的是这个算法的思路简单粗暴,凭借这一点它就在主流的分词算法中占了一席之地。

思路:基于词典+基于统计

##首先提一下基于词典的三个基本方法

  基于词典的归类下也就是上面列出来的MM(Maximum Matching)、RMM(Reverse Maximum Matching)、最少切分这三种,而这三种方法自由组合一下,也可以提高分词的准确度。

举个栗子:  

词典:

有意
意见
分歧

待宰割的句子:

  有意见分歧

MM

肢解:

  就是去词典里面找匹配的词,不过要有顺序哦,从左到右的划分→_→

  有意见分歧:词典里有这个词

  有意见分歧:有意的长度多了一个字,按照Maximum的思想,当然就是有意

  有意分歧:有意已经完成了,开始了,只有一个词是以开头的,那就是它咯

  有意见分歧:词典里面也只有一个以开头的词—分歧

结果:

  有意/见/分歧

果然是简单的不能再简单了,但是真的是我们想要的结果么?答案很明显

如果要是从句末开始呢?

RMM

肢解:

  注:这里只是讲解这个思路,实际应用请参照各类开源分词词典

  这次我们从右往左看←_←

  有意见分歧:就这么一个以结尾的词哦,就用它了

  有意分歧:词典里有两个字结尾的词,其一就是这个

  有意见分歧:其二就是这个意见意见要比多了一个字,就意见

  有意见分歧:只剩一个了,那就它自己占一个位子了

结果:

  有/意见/分歧

其实思路是一样的,但结果还是有些差别的,浏览过很多个博客的分词文章,出现概率很高的一句话:统计结果表明,单纯使用正向最大匹配的错误率为 1/169,单纯使用逆向最大匹配的错误率为 1/245。

最少切分

这个看名字也大概能知道个八九不离十。可以这样想这样一个场景,划分:

中华人民共和国

在相当一部分情况下,我们当然希望看到中华人民共和国作为一整个词被划分,而不是中华/人民/共和国

## 已经了解了基于词典的三个基本方法,继续MMSeg

MMSeg = MM + Seg = Maximum Matching + Segmentation

  这个算法的名称很清晰的表明了它使用的基本思想:正向最大匹配规则。

下面进入另外一个栗子:

  研究生命起源

当然还是需要给定一个词典:

研究
研究生
生命
起源

可能你很想知道我这些词典是从哪里来的,好吧,实话告诉你,是我编的\(^o^)/,但这完全不妨碍我讲解这个分词算法,并且它可以更好的给予形象支持。

根据上面的方法可以知道按照MM方法可以分出来:研究生/命/起源。大部分时候结果肯定是不尽如人意。那是否可以考虑下其他的方案呢?我们最想看到的当然是:研究/生命/起源,聪明的读者肯定可以想到,这个如果用RMM的话就可以轻松办到咯,没错!那我们为什么还要用什么MMSeg的过滤器来拆词呢?

(在这里搁浅了好久,一方面实在没时间继续写;另一方才是主要原因,我都举不出反例来,果然分析的词还是太少Orz;容贫尼继续吧,先放过这一马吧~等我后面有看到或者有好心人提醒我的时候,再补充上例子来解决这个问题:“为什么我还要用MMSeg呢?”)

在这里我得先假定我们需要MMSeg了。。然后分词的流程就像下面画的:

如何给wordpress首页自动显示文章内容的第一个图片 - 周 金根  阅读原文»

敏捷个人手机应用中使用到的数据来源于wordpress中,因为自己写的页面,所以可以自己写代码获取文章内容的第一个图片作为文章缩略图来显示,这样用户看到首页时图文并茂,感觉会好一些。

现在后台简单的使用PHP编写,使用正则表达式获取第一个图片地址

//格式化博客列表内容
private function formatIndexContent($blogs) {
//strip $rs content
foreach ($blogs as $blog) {
preg_match_all('|<img.*?src=[\'"](.*?)[\'"].*?>|i', $blog->post_content, $images);
$match = $images[1];
if (count($match) == 0) {
$blog->pic = "";
}
else {
$blog->pic = $match[0];
}
$blog->post_content = mb_substr(strip_tags($blog->post_content), 0, 140) . "...";
}
return json_encode($blogs);
}

敏捷个人网站使用的是自带的主题 Twenty Eleven Theme,之前也想把网页上wordpress首页自动显示一下缩略图,不过查找了一下网络,找到一个插件,用了一下发现这个插件的机制是生成一张缩略图,而我不希望它在我服务器上生成图片,我只是想要自动显示第一张图片作为缩略图而已。没改之前是这样的显示页面,看起来是不是觉得单调呢?

想改了好几次,今天决定改掉它,结果现在如下,是不是看了起来舒服多了啊。

下面我简单说一下,如何修改wordpress的php带来来实现这个首页自动显示文章内容缩略图的功能。

  1. 找到主题下的functions.php,增加一个现实第一个图片的方法。我是用的是 twentyeleven 主题,所以修改文件存在于 wp-content/themes/twentyeleven/functions.php
    //获取文章第一张图片,如果没有图就会显示默认的图
    function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];
    if(empty($first_img)){
    $first_img = bloginfo('template_url'). '/images/default-thumb.jpg';
    }
    return $first_img;
    }
  2. 首页是index.php生成的,我们能看到以下代码,
    <?php get_template_part( 'content', get_post_format() ); ?>

    说明是根据文章类型来生成的内容,不同文章类型的内容生成文件一般是content*.php的文件

    我的文章之前都是用相册类型编写的,所以我只需要修改 content-gallery.php文件即可。找到 <div class="entry-content">,在后面添加显示图片的代码即可
    <div class="entry-content">
    <a href="<?php the_permalink(); ?>"><img src="<?php echo catch_that_image() ?>" alt="<?php the_title(); ?>"/></a> //增加这一行即可
    <?php if ( post_password_required() ) : ?>
  3. 修改后,把functions.php和 content-gallery.php上传到服务器后即可

本文链接:如何给wordpress首页自动显示文章内容的第一个图片,转载请注明。

阅读更多内容

没有评论:

发表评论