一个项目中的分词算法

原来项目中的一种经过实际证明有效到近似语义效果的分词算法,归档下。

一、概述:

一种方法,对于一篇文字材料,能筛选出其中重要的字来帮助人们做到不用精细的通读全文就能获得最重要信息。 按照一定的语言规则,如与人们习惯中强调的单词距离较近的单词,在文本中被大写的单词,在一个网页中,被一定的标签修饰的单词,在一篇文章中出现次数较多的单词,在文章的标题中出现的单词等一般都认为是相对较重要的单词。也正基于这些关于人们使用语言的方法和习惯,通过一定的算法分指标的考察单词的重要性,从而就可以得到一篇文章中的重要单词和短语。

二、算法描述:

1.输入:文本、Html脚本文件

2.输出:概念集合。

包含每个概念的属性,如p_count,表示一个概念在一个文本中出现的次数;rank,表示这个概念的重要级别。

3.重要字分类说明:

  • ??????????? Type0:在此处切断分割。
  • ??????????? Type1:不能单独构成概念的单词;
  • ??????????? Type2:不能出现在概念的首尾的单词;
  • ??????????? Type3:
  • ??????????? Type4:重要字,级别为4;
  • ??????????? Type5:重要字,级别为5;
  • ??????????? Type6:重要字,级别为6;
  • ??????????? SPD0: 0类排除字,须从形成的概念集合中排除出现在其中的概念,
  • ??????????? SPD1: 1类排除字,reserved。
  • ??????????? SPD2: 2类排除字,当有概念的单词出现在该集合中,则该概念中单个单词形成的概念须删除。

4.处理步骤:

1>参数载入。载入算法实现中用到的一些评价参数,如分类的字库,一些门限值和计算级别的参数指标。

2>? 当要处理的是Html的脚本时,需要对其进行一些预处理,以利于后面对该文本的操作。主要有:

  • 去掉无用的标签。
  • 将的网页中的转义字符转化为通用字符的形式。

3>分割成段。将输入的文本按照规则,划分为段。

划分规则为:在以下位置切断

    • type-0必须切断的单词
    • 标点:非字母数字的字符,并且后接空格、格式字符、html标签
    • html标签

流程说明:

根据正则匹配的对于文本中不同的字符采取不同的处理。

pattern = ((?<tag><.+?>)|(?<html>&[a-z]{4,5};)|(?<word>\b[a-zA-???????????????????? Z]([^\s\w\d<>]{1,4}[\w\d]|[\w\d])*)|(?<punctuation>[^\s\w\d<>](?=[\s|\<]))|(?<parenthesis>\(.*?\))|(?<number>(\s|>)([0-9]+,)*[0-9]+[^<\s]*))

a 当碰到一个单词时,在将该词存入一个数组之前会首先判断当前数组中存放的处理单词个数是否小于30,若大于30,则可以认为是异常的段,不存入数组,不形成段。当读到的单词是Type0时,将该单词从数组中删除,若又是重要字时,则记录该重要字。循环判断当前形成的Segment的最后一个词是Type2,则从数组中删除之,最后,调用切断的处理。当当前数组中只有一个单词时,判断该单词不能为Type2类型,否则,清除Segment数组。

b 当碰到一个Html标签时,会根据不同的标签进行以下不同的处理。

  • 一类标签,记录标签个数,以影响在其中形成的概念的重要级别,并调用切断处理;
  • 二类标签,记录标签个数,以影响在其中形成的概念的重要级别,不调用切断处理;
  • 三类标签,不记录标签个数,只是在该处切断,调用切断处理。

c 当碰到标点,括号和数字时,以及上面在单词处理中判断到是Type0时,或在标签处理中判断到是要切断的标签时,调用切断处理。首先,循环判断当前数组的第一个单词不能是Type2类型,否则,从数组中删除。 当数组长度为1时,判断该单词不能为Type1,否则,从数组中删除。最后将将数组中的单词拼接成字串形成一个段,并根据前面划分段时得到一些属性如标签权值、标题权值等设置该段的属性,并将段存放到一个段的集合中。

4>由段形成概念。根据概念形成的规则,从形成的段的集合中取出每一个段,分割为概念,设定概念的属性,存到到概念集合中。

首先,将段分割为概念,分割规则为:

  • 一个字的概念如果属于type1,就不能作为概念存在;
  • 如果一个概念的开头和结尾有type-2的单词,这种概念也不能存在;

对于字长为1的段,可以不用判断直接构造概念,因为在前面构造段时已经作过了应有的判断;

对于字长介于2和5之间的,依次尝试构造长度为1、2、3、4、5的概念。每次都要做用形成概念的规则检查形成概念的合法性,将合法的概念加入到该段形成的概念集合中去。

对于长度大于5的的段首先分割成长度小于5的段。然后再首先按照type-2切割,如果没有type2按照type1切割,如果没有type1则按照5个一组切分,再由各段形成概念。

然后为分割得到的概念设定属性,要考察的属性有:

  • 出现次数属性(某个概念在全文的出现次数)、
  • 大写属性(某个概念的首字母是否大写,某个概念的字母是否全部大写)、
  • title标签属性(某个概念是否出现在网页的title标签中)、
  • 接近重要字属性(某个概念与排除字表中重要字的距离)、
  • 标签属性(某个概念所处的标签个数记录)

其中有些属性是从生成概念的段中继承过了,一些则是在由段分割成概念时计算得到。

最后将生成概念加到概念集合中去。当要加入的概念在概念集合中已经存在时,不会将新概念加入,只是将新概念的属性与存在的旧概念合并,若生成的概念在概念集合中不存在时,就将其加入。

5>对形成的概念再做处理。

当有概念的单词出现在SPD2中,则将该概念中单个单词形成的概念删除。

删除低频概念,依照一定的门限值将出现次数较少的概念从存储概念的集合中删除;

当一些长的概念总是包含短的概念时,则删除这些短的概念。以减少概念的重复,增强概念的有效性;

合并相同词根的概念。在形成的概念中,当判断到一些概念有相同的词根时,就采用其中出现次数较大的一个概念来代表这一组概念,将该组其他概念的出现次数都加到这一个概念上,并删除其他概念。

计算每个概念的重要性等级。作为考察评价概念重要性的一个指标

计算公式为:

三、补充说明:

 

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: 一个项目中的分词算法


No comments yet.

发表评论