<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>bosonnlp (BosonNLP)</title>
    <link>https://ruby-china.org/bosonnlp</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>一行命令让 ElasticSearch 支持中文分词搜索</title>
      <description>&lt;p&gt;相信大家在开发博客，在线商城的时候会涉及到搜索功能。而近几年火起来的 ElasticSearch（ES）凭借其稳定、可靠、快速的实时搜索普遍受到大家的好评，连 Github、SoundCloud 也都将 ES 作为其核心搜索组件。&lt;/p&gt;

&lt;p&gt;但是 ES 本身对中文分词和搜索比较局限。因为内置的分析器在处理中文分词时，只有两种方式：一种是单字（unigrams）形式，即简单粗暴的将中文的每一个汉字作为一个词（token）分开；另一种是两字（bigrams）的，也就是任意相邻的两个汉字作为一个词分开。这两种方式都不能很好的满足现在的中文分词需求，&lt;strong&gt;进而影响了搜索结果&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;举个例子：
假设我们的 index 里面存储了 3 篇 documents 如下：&lt;/p&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;content&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;美称中国武器商很神秘 花巨资海外参展却一言不发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;在第一界国际锦标赛中 国家代表李雷勇夺冠军&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;国武公司近日上市&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Case 1：查询“中国”，期望只得到 id 为 1 的 document。&lt;/p&gt;

&lt;p&gt;用 unigram 的分析器（即默认的 Standard Analyzer）查询结果为 id 1 和 id 2 的 content；bigram 的分析器（名为 cjk）的结果为 id 1。Standard Analyzer 没有给出预期结果是因为它把“中国”切分为“中”、“国”2 个 token，因此误给出了 id 2 的结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Case 2：查询“国武”这一家公司，期望只得到 id 为 3 的 document。&lt;/p&gt;

&lt;p&gt;Standard Analyzer 和 cjk 的查询结果都会同时给出 id 1 和 id 3 的 document，但是 id 1 的 document 中的“国武”并不是所指的公司。&lt;/p&gt;

&lt;p&gt;（注：以上查询均用 query_string）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;因此我们可以发现内置的分析器有它的局限性，并不能满足复杂或者特定的搜索需求。为此，玻森数据开发了一款基于玻森中文分词的 ES 插件（Elasticsearch-Analysis-BosonNLP），方便大家对中文数据进行更精确的搜索。&lt;/p&gt;

&lt;p&gt;现在已有一些成熟的 ES 中文分词插件，但在分词引擎准确率上，相信 BosonNLP 的中文分词能满足大家不同领域上多样化的需求。有兴趣的朋友可以查看&lt;a href="http://blog.bosonnlp.com/c16a60c5b591.html" rel="nofollow" target="_blank" title=""&gt;11 款开放中文分词引擎大比拼&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;接下来，3 分钟教会大家如何安装使用玻森 ES 中文分词插件 Beta 版（以 ES 2.2.0 版本为例）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;只需如下一个命令。&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo bin/plugin install https://github.com/bosondata/elasticsearch-analysis-bosonnlp/releases/download/1.3.0-beta/elasticsearch-analysis-bosonnlp-1.3.0-beta.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注：对于其他不同版本的 ES，只需要在命令里更换对应的插件版本号即可。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;使用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;需要在&lt;code&gt;elasticsearch.yml&lt;/code&gt;文件中的 analyzer 里配置好玻森 bosonnlp analyzer（需要配置 API_TOKEN 以及分词的参数）。&lt;a href="https://github.com/bosondata/elasticsearch-analysis-bosonnlp/blob/master/README.md" rel="nofollow" target="_blank" title=""&gt;详情解释请查看 Github 上玻森 ES 中文分词的 README&lt;/a&gt;。&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;bosonnlp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bosonnlp&lt;/span&gt;
    &lt;span class="na"&gt;API_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://api.bosonnlp.com/tag/analysis&lt;/span&gt;
    &lt;span class="na"&gt;API_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*PUT&lt;/span&gt; &lt;span class="s"&gt;YOUR API TOKEN HERE*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完成以上步骤之后便可以使用玻森 ES 分词插件了。&lt;/p&gt;

&lt;p&gt;对比之前 Case 2 的查询：查询“国武”这一家公司，期望只得到 id 为 3 的 document。玻森 ES 分词插件搜索结果：&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"took"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timed_out"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_shards"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"successful"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"failed"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hits"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"max_score"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.15342641&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"hits"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"_index"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bosonnlp_test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"_type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"_id"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"_score"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.15342641&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"_source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"国武公司近日上市"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，如果对分词有特定需求的小伙伴可以在配置里修改对应的参数。目前，玻森数据对于中文分词提供了繁简转换、新词发现等功能，能满足不同领域的搜索需求。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;希望这款插件能提升你的工作效率！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/bosondata/elasticsearch-analysis-bosonnlp" rel="nofollow" target="_blank" title=""&gt;GitHub&lt;/a&gt;上有具体的说明。&lt;a href="https://gist.github.com/ba9els/262509c3a113d59df964" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;附上例子中索引 document 的 bash 文件以方便测试。&lt;/p&gt;</description>
      <author>bosonnlp</author>
      <pubDate>Fri, 25 Mar 2016 14:25:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/29459</link>
      <guid>https://ruby-china.org/topics/29459</guid>
    </item>
    <item>
      <title>基于 deep learning 的古体诗生成机器人</title>
      <description>&lt;p&gt;基于 deep learning 的古体诗生成机器人&lt;/p&gt;

&lt;p&gt;&lt;a href="http://poem.bosonnlp.com" rel="nofollow" target="_blank"&gt;http://poem.bosonnlp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;可自定义文字作藏头诗，欢迎把玩。&lt;/p&gt;</description>
      <author>bosonnlp</author>
      <pubDate>Fri, 15 Jan 2016 11:58:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/28741</link>
      <guid>https://ruby-china.org/topics/28741</guid>
    </item>
    <item>
      <title>玻森新闻自动摘要算法简介</title>
      <description>&lt;p&gt;自动摘要（或摘要技术 Automatic Summarization），顾名思义，是指从单篇或者多篇文章中，摘取要点来概括文章大意的技术。它在机器学习和数据挖掘中有着重要的地位。&lt;/p&gt;

&lt;p&gt;在这篇文章中，将要详细谈一谈自动摘要算法实现，以及玻森进行的优化。（对于自动摘要概念有兴趣想深入了解的读者可以自行搜索，该篇文章中在这方面不作详细介绍。）&lt;/p&gt;

&lt;p&gt;自动摘要可以分为笼统式和查询式。由于查询式摘要的应用场景较为特定，笼统式摘要成为现阶段主流，它也能在很大程度上满足人们对摘要的需求。因此玻森的新闻摘要是笼统式抽取摘要。&lt;/p&gt;

&lt;p&gt;玻森采用的是最大边缘相关模型（Maximal Marginal Relevance）的一个变种。MMR 是无监督学习模型，它的提出是为了提高信息检索（Information Retrieval）系统的表现。例如搜索引擎就是目前大家最常用的信息检索系统。大家可能经常会碰到，对于我们输入的一个关键词，搜索引擎通常会给出重复的或者内容太接近的检索的情况。为了避免这个现象，搜索引擎可以通过 MMR 来增加内容的多样性，给出多方面考虑的检索结果，以此来提高表现。&lt;/p&gt;

&lt;p&gt;这样的思想是可以被借鉴用来做摘要的，因为它是符合摘要的基本要求的，即权衡相关性和多样性。不难理解，摘要结果与原文的相关性越高，它就接近全文中心意思。而考虑多样性则使得摘要内容更加的全面。非常的直观和简单是该模型的一个优点。&lt;/p&gt;

&lt;p&gt;相比于其他无监督学习方法，如 TextRank（TR），PageRank（PR）等，MMR 是考虑了信息的多样性来避免重复结果。TR，PR 是基于图（Graph）的学习方法，每个句子看成点，每两个点之间都有一条带权重（Weighted）的无向边。边的权重隐式定义了不同句子间的游走概率。这些方法把做摘要的问题看成随机游走来找出稳态分布（Stable Distribution）下的高概率（重要）的句子集，但缺点之一便是无法避免选出来的句子相互之间的相似度极高的现象。&lt;/p&gt;

&lt;p&gt;而 MMR 方法可以较好地解决句子选择多样性的问题。具体地说，在 MMR 模型中，同时将相关性和多样性进行衡量。因此，可以方便的调节相关性和多样性的权重来满足偏向“需要相似的内容”或者偏向“需要不同方面的内容”的要求。对于相关性和多样性的具体评估，玻森是通过定义句子之间的语义相似度实现。句子相似度越高，则相关性越高而多样性越低。&lt;/p&gt;

&lt;p&gt;自动摘要的核心便是要从原文句子中选一个句子集合，使得该集合在相关性与多样性的评测标准下，得分最高。数学表达式如下。
&lt;img src="https://l.ruby-china.com/photo/2016/a9d4567d5d0154ac8c61e437e6a1836f.png" title="" alt=""&gt;
需要注意的是，D，Q，R，S 都为句子集，其中，D 表示当前文章，Q 表示当前中心意思，R 表示当前非摘要，S 表示当前摘要。&lt;/p&gt;

&lt;p&gt;可以看出，在给定句子相似度的情况下，上述 MMR 的求解为一个标准的最优化问题。但是，上述无监督学习的 MMR 所得摘要准确性较低，因为全文的结构信息难以被建模，如段落首句应当有更高的权重等。为了提高新闻自动摘要的表现，玻森在模型中加入了全文结构特征，将 MMR 改为有监督学习方法。从而模型便可以通过训练从“标准摘要”中学习特征以提高准确性。&lt;/p&gt;

&lt;p&gt;玻森采用摘要公认的 Bi-gram ROUGE F1 方法来判断自动生成的摘要和“标准摘要”的接近程度。经过训练，玻森在训练数集上的表现相对于未学习的摘要结果有了明显的提升——训练后的摘要系统 F1 提高了 30%。值得一提的是，在特征训练中，为了改善摘要结果的可读性，玻森加指代关系特征，使得模型表现提高了 8%。&lt;/p&gt;

&lt;p&gt;摘要引擎的具体调用 API 可以&lt;a href="http://docs.bosonnlp.com/summary.html" rel="nofollow" target="_blank" title=""&gt;参见文档&lt;/a&gt;&lt;/p&gt;</description>
      <author>bosonnlp</author>
      <pubDate>Thu, 07 Jan 2016 13:55:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/28642</link>
      <guid>https://ruby-china.org/topics/28642</guid>
    </item>
    <item>
      <title>11 款开放中文分词引擎大比拼</title>
      <description>&lt;p&gt;在逐渐步入 DT（Data Technology）时代的今天，自然语义分析技术越发不可或缺。对于我们每天打交道的中文来说，并没有类似英文空格的边界标志。而理解句子所包含的词语，则是理解汉语语句的第一步。汉语自动分词的任务，通俗地说，就是要由机器在文本中的词与词之间自动加上空格。
一提到自动分词，通常会遇到两种比较典型的质疑。一种质疑是来自外行人的：这件事看上去平凡之极，好像一点儿也不“fancy”，会有什么用呢？另一种质疑则是来自业内：自动分词研究已经进行了数年，而网上也存在各种不同的开放分词系统，但对于实际商用似乎也未见一个“即插即用”的系统。
那么，目前常见的开放分词引擎，到底性能如何呢？为了进行测试，我们调研了 11 款网上常见的并且公开提供服务的分词系统，包括：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/63c22c1615f11ece6a5c427297c47534.png" title="" alt=""&gt;&lt;br&gt;
分词的客观量化测试离不开标注数据，即人工所准备的分词“标准答案”。在数据源方面，我们将测试分为:
1.新闻数据：140 篇，共 30517 词语；
2.微博数据：200 篇，共 12962 词语；
3.汽车论坛数据（汽车之家）100 篇：共 27452 词语；
4.餐饮点评数据（大众点评）：100 条，共 8295 词语。&lt;/p&gt;

&lt;p&gt;准确度计算规则：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;将所有标点符号去除，不做比较&lt;/li&gt;
&lt;li&gt;参与测试的部分系统进行了实体识别，可能造成词语认定的不统一。我们将对应位置替换成了人工标注的结果，得到准确率估算的上界。&lt;/li&gt;
&lt;li&gt;经过以上处理，用 SIGHAN 分词评分脚本比较得到最终的准确率，召回率和 F1 值。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;以上所有数据采用北大现代汉语基本加工规范对所有数据进行分词作为标准。具体数据下载地址请参见附录。通过这四类数据综合对比不同分词系统的分词准确度。
         &lt;img src="https://l.ruby-china.com/photo/2015/1ad1f334af20ccdf927675b19047e683.png" title="" alt=""&gt;
上图为参与比较的 10 款分词引擎在不同数据的分词准确度结果。可以看出，在所测试的四个数据集上，BosonNLP 和哈工大语言云都取得了较高的分词准确率，尤其在新闻数据上。因为庖丁解牛是将所有可能成词的词语全部扫描出来（例如：“最不满意”分为：“最不  不满   满意”），与其他系统输出规范不同，因而不参与准确率统计。
为了更直接的比较不同数据源的差别，我们从每个数据源的测试数据中抽取比较典型的示例进行更直观的对比。&lt;/p&gt;

&lt;p&gt;【新闻数据】
新闻数据的特点是用词规整，符合语法规则，也是普遍做得比较不错的一个领域。对比其他数据源，有 7 家系统都在新闻领域达到最高。包括 IKAnalyzer、盘古分词、搜狗分词、新浪云、NLPIR、语言云、BosonNLP。并且有三家系统准确率超过 90%。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/5855d741ad6e49b607cc5b9cf37178c1.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【微博数据】
微博数据用词多样、话题广泛，并常包含错别字及网络流行词。能够比较全面的体现每家分词系统的准确度。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/85375d58c7984780d90604ef3c7f2614.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【汽车论坛】
汽车数据是针对汽车领域的专业评价数据，会出现很多的专业术语。例如示例中的“胎噪”、“风燥”等，如果系统没有足够强大的训练词库或领域优化，会使准确率有较大程度降低。比较有意思的是，对比其他数据源，有 3 家系统都在汽车论坛领域达到最高：腾讯文智、SCWS 中文分词、结巴分词。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/94d743144faad6ff0e9e9b0eed1a8bf0.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【餐饮点评】
餐饮点评数据为顾客评论数据，更偏重口语化。会出现很多类似“闺蜜”、“萌萌哒”口语化词语和很多不规范的表达，使分词更加困难。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/219f842e00b45a609771b620abc052a4.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;各家系统对于多数简单规范的文本的分词已经达到很高的水平。但在仔细对比每一家中文分词后依旧发现切分歧义词和未登陆词（即未在训练数据中出现的词）仍然是影响分词准确度的两大“拦路虎”。
1.切分歧义：根据测试数据的切分结果，一类属于机器形式的歧义，在真实语言环境下，只有唯一可能的正确切分结果，称其为伪歧义。另一类有两种以上可实现的切分结果，称为真歧义。由于真歧义数据无法比较正确或者错误。所有我们着重举例来比较各家系统对伪歧义的处理效果。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/dfe3b6431b0e2c896ac19f9840d68efb.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;示例中原意指伦敦奥运会可能有一位沙特阿拉伯的女子，错误分词的意思是指上将（军衔）中有一位是沙特阿拉伯的女子，句意截然不同。当然，分析的层次越深，机器对知识库质量、规模等的依赖性就越强，所需要的时间、空间代价也就越大。
2.未登录词：未登录词大致包含三大类：
a) 新涌现的通用词：类似“神马”、“纳尼”、“甩卖”、“玫瑰金”等新思想、新事物所带来的新词汇，不管是文化的、政治的、还是经济的，在人们的生活中不断涌现。同时很多词语也具有一定的时效性。
b) 专业术语：是相对日常用语而言的，一般指的某一行业各种名称用语，大多数情况为该领域的专业人士所熟知。这种未登录词理论上是可预期的。能够人工预先添加到词表中（但这也只是理想状态，在真实环境下并不易做到）。
c) 专有名词：如中国人名、外国译名、地名、公司名等。这种词语很多基本上不可通过词典覆盖，考验分词系统的新词识别能力。&lt;/p&gt;

&lt;p&gt;【新涌现的通用词或专业术语】
示例中的蓝色字包括专业术语：“肚腩”、“腹肌”、“腹直肌”、“腹外斜肌”、“腹横肌”；新涌现的通用词：“人鱼线”、“马甲线”。大多数的系统对于示例文本的分词结果都不够理想，例如：“大肚  腩”（SCWS 中文分词） “腹  直  肌  腹  外  斜  肌”（搜狗分词、IKAnalyer、NLPIR、SCWS 中文分词）、“人  鱼线”（PHP 结巴分词）。总的来说这两种类型的数据每家系统都存在一定的缺陷，相对而言哈工大的语言云在这方面表现的较好。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/ebdf7fd34c4c64367c2673747b8fc629.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;【专有名词】
示例出现的专有名词包括“蒂莫西伊斯顿”（姓名）、“英国”“意大利”“北欧”（地点）、“金斯敦”（机构名）、“伊丽莎白  格林希尔兹”（机构名）。而这种用词典无法穷尽的专有名词也成为各家分词准确率降低的重要原因。其中搜狗分词、IKAnalyer、PHP 结巴分词、腾讯文智、SCWS 中文分词在新词识别时较为谨慎，常将这类专有名词切分成多个词语。 &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/054ef77b7a046561107d1ac6ec1f9a93.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;当然在分词准确度可以接受的情况下，很多细节问题，包括是否有出错情况、是否支持各种字符、是否标注词性等都可能让我们望而却步。在分词颗粒度选择当中，BosonNLP、SCWS、盘古分词、结巴分词、庖丁解牛都提供了多种选择，可以根据需求来采用不同的分词粒度。与北大的分词标准对比来说，新浪云默认的分词粒度较大，而搜狗分词、腾讯文智分词粒度相对较小。除此之外，BosonNLP、新浪云、NLPIR、腾讯文智同时提供了实体识别、情感分析、新闻分类等其他扩展服务。下表给出了各家系统在应用方面的详细对比。
&lt;img src="https://l.ruby-china.com/photo/2015/6ac66cd3756a64fba395fe307512a009.png" title="" alt=""&gt;
中文分词是其他中文信息处理的基础，并且在很多领域都有广泛的应用，包括搜索引擎、机器翻译（MT）、语音合成、自动分类、自动摘要、自动校对等等。随着非结构化文本的广泛应用，中文分词等文本处理技术也变得越来越重要。通过评测可以看出，部分开放分词系统在不同领域已经达到较高准确率。对于数据分析处理的从业者，相信在此之上构建数据分析系统、人机交互平台，更能够起到事半功倍的效果。&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注意：分词数据准备及评测由 BosonNLP 完成。&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;附录&lt;/strong&gt;
评测数据地址
&lt;a href="http://bosonnlp.com/dev/resource" rel="nofollow" target="_blank"&gt;http://bosonnlp.com/dev/resource&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;各家分词系统链接地址
BosonNLP：&lt;a href="http://bosonnlp.com/dev/center" rel="nofollow" target="_blank"&gt;http://bosonnlp.com/dev/center&lt;/a&gt;
IKAnalyzer：&lt;a href="http://www.oschina.net/p/ikanalyzer" rel="nofollow" target="_blank"&gt;http://www.oschina.net/p/ikanalyzer&lt;/a&gt;
NLPIR：&lt;a href="http://ictclas.nlpir.org/docs" rel="nofollow" target="_blank"&gt;http://ictclas.nlpir.org/docs&lt;/a&gt;
SCWS 中文分词：&lt;a href="http://www.xunsearch.com/scws/docs.php" rel="nofollow" target="_blank"&gt;http://www.xunsearch.com/scws/docs.php&lt;/a&gt;
结巴分词：&lt;a href="https://github.com/fxsjy/jieba" rel="nofollow" target="_blank"&gt;https://github.com/fxsjy/jieba&lt;/a&gt;
盘古分词：&lt;a href="http://pangusegment.codeplex.com/" rel="nofollow" target="_blank"&gt;http://pangusegment.codeplex.com/&lt;/a&gt;
庖丁解牛：&lt;a href="https://code.google.com/p/paoding/" rel="nofollow" target="_blank"&gt;https://code.google.com/p/paoding/&lt;/a&gt;
搜狗分词：&lt;a href="http://www.sogou.com/labs/webservice/" rel="nofollow" target="_blank"&gt;http://www.sogou.com/labs/webservice/&lt;/a&gt;
腾讯文智：
&lt;a href="http://www.qcloud.com/wiki/API%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3" rel="nofollow" target="_blank"&gt;http://www.qcloud.com/wiki/API%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3&lt;/a&gt;
新浪云：&lt;a href="http://www.sinacloud.com/doc/sae/python/segment.html" rel="nofollow" target="_blank"&gt;http://www.sinacloud.com/doc/sae/python/segment.html&lt;/a&gt;
语言云：&lt;a href="http://www.ltp-cloud.com/document" rel="nofollow" target="_blank"&gt;http://www.ltp-cloud.com/document&lt;/a&gt;&lt;/p&gt;</description>
      <author>bosonnlp</author>
      <pubDate>Mon, 09 Nov 2015 14:56:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/28000</link>
      <guid>https://ruby-china.org/topics/28000</guid>
    </item>
    <item>
      <title>BosonNLP 分词解密</title>
      <description>&lt;p&gt;在九月初 BosonNLP 全面开放了分词和词性标注引擎以后，很多尤其是从事数据处理和自然语言研究的朋友在试用后很好奇，玻森如何能够做到目前的高准确率？希望这篇文章能够帮助大家理解玻森分词背后的实现原理。&lt;/p&gt;

&lt;p&gt;众所周知，中文并不像英文那样词与词之间用空格隔开，因此，在一般情况下，中文分词与词性标注往往是中文自然语言处理的第一步。一个好的分词系统是有效进行中文相关数据分析和产品开发的重要保证。&lt;/p&gt;

&lt;p&gt;玻森采用的结构化预测模型是传统线性条件随机场（Linear-chain CRF）的一个变种。在过去及几年的分词研究中，虽然以字符为单位进行编码，从而预测分词与词性标注的文献占到了主流。这类模型虽然实现较容易，但比较难捕捉到高阶预测变量之间的关系。比如传统进行词性标注问题上使用 Tri-gram 特征能够得到较高准确率的结果，但一阶甚至高阶的字符 CRF 都难以建立这样的关联。所以玻森在字符编码以外加入了词语的信息，使这种高阶作用同样能被捕捉。&lt;/p&gt;

&lt;p&gt;分词与词性标注中，新词识别与组合切分歧义是两个核心挑战。玻森在这方面做了不少的优化，包括对特殊字符的处理，对比较有规律的构词方式的特征捕捉等。例如，近些年比较流行采用半监督的方式，通过使用在大规模无标注数据上的统计数据来改善有监督学习中的标注结果，也在我们的分词实现上有所应用。比如通过使用 accressory variety 作为特征，能够比较有效发现不同领域的新词，提升泛化能力。&lt;/p&gt;

&lt;p&gt;我们都知道上下文信息是解决组合切分歧义的重要手段。而作为一个面向实际商用环境的算法，除了在准确率上的要求之外，还需要注意模型算法的时间复杂度需要足够高效。例如，相比于普通的 Linear-chain CRF，Skip-chain CRF 因为加入了更多的上下文信息，能够在准确率上达到更好的效果，但因为其它在训练和解码过程，不论是精确算法还是近似算法，都难以达到我们对速度的要求，所以并没有在我们最终实现中采用。一个比较有趣的分词改进是我们捕捉了中文中常见的固定搭配词对信息。譬如，如“得出某个结论”、 “回答某个提问”等。如果前面出现“得出” ，后面出现“结论” ，那么“得出”和“结论”作为一个词语出现的可能性就会很大，与这种相冲突的分词方案的可能性就会很小。这类固定搭配也可以被建模，用于解决部分分词错误的问题。&lt;/p&gt;

&lt;p&gt;怎样确定两个词是否是固定的搭配呢？我们通过计算两个词间的归一化逐点互信息 (NPMI) 来确定两个词的搭配关系。逐点互信息（PMI），经常用在自然语言处理中，用于衡量两个事件的紧密程度。归一化逐点互信息（NPMI）是逐点互信息的归一化形式，将逐点互信息的值归一化到 -1 到 1 之间。如果两个词在一定距离范围内共同出现，则认为这两个词共现。筛选出 NPMI 高的两个词作为固定搭配，然后将这组固定搭配作为一个组合特征添加到分词程序中。如“回答”和“问题”是一组固定的搭配，如果在标注“回答”的时候，就会找后面一段距离范围内是否有“问题”，如果存在那么该特征被激活。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/9dccfc9cc0feb2097f5e9b81451b9ac0.png" title="" alt=""&gt;
归一化逐点互信息 (npmi) 的计算公式
&lt;img src="https://l.ruby-china.com/photo/2015/8d2f2b0891dfb6874a231c9cc4b10fce.png" title="" alt=""&gt;
逐点互信息 (pmi) 的计算公式&lt;/p&gt;

&lt;p&gt;可以看出，如果我们提取固定搭配不限制距离，会使后面偶然出现某个词的概率增大，降低该统计的稳定性。在具体实现中，我们限定了成为固定搭配的词对在原文中的距离必须小于一个常数。具体来看，可以采用倒排索引，通过词找到其所在的位置，进而判断其位置是否在可接受的区间。这个简单的实现有个比较大的问题，即在特定构造的文本中，判断两个词是否为固定搭配有可能需要遍历位置数组，每次查询就有 O(n) 的时间复杂度了，并且可以使用二分查找进一步降低复杂度为 O(logn)。&lt;/p&gt;

&lt;p&gt;其实这个词对检索问题有一个更高效的算法实现。我们采用滑动窗口的方法进行统计：在枚举词的同时维护一张词表，保存在当前位置前后一段距离中出现的可能成词的字符序列；当枚举词的位置向后移动时，窗口也随之移动。这样在遍历到“回答”的时候，就可以通过查表确定后面是否有“问题”了，同样在遇到后面的“问题”也可以通过查表确定前面是否有“回答”。当枚举下一个词的时候，词表也相应地进行调整。采用哈希表的方式查询词表，这样计算一个固定搭配型时间复杂度就可以是 O(1) 了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/158fde2db936d0a76a6da683959fb074.png" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;通过引入上述的上下文的信息，分词与词性标注的准确率有近 1% 的提升，而对算法的时间复杂度没有改变。我们也在不断迭代升级以保证引擎能够越来越准确，改善其通用性和易用性。今后我们也会在 BosonNLP 微信账户更多享我们在自然语言处理方面的经验，欢迎关注！&lt;/p&gt;</description>
      <author>bosonnlp</author>
      <pubDate>Thu, 22 Oct 2015 14:26:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/27782</link>
      <guid>https://ruby-china.org/topics/27782</guid>
    </item>
  </channel>
</rss>
