基于信息熵原理分词这个概念很早了,用php实现了个,一气呵成,代码自然是,反正我也没有二次检查,呵呵。不过耗费内存是真的,真的很消耗内存!

写这个的好处就是我明白了很多东西…

代码如下

/**

* 基于信息熵的无词典分词

*/

class partword{

/**

* 词语最大长度

*/

public $maxwordlen = 5;

/**

* 需要进行分词的文字

*/

public $text;

/**

* 字符串长度

*/

private $len;

/**

* 切分的单个文字

*/

private $textarr;

/**

* 文字信息数组

*/

private $wordinfo;

/**

* 初始化文字,将文字进行分割

*/

public function initWords(){

$i = 0;

$len = strlen($this->text);

$strarr = array();

$word = '';//单词缓存

$en_write = False;

while( $i

$ascnum = ord($this->text[$i]);

if( $ascnum >=224 ){ //高位大于244,utf8规定为3个字节

$zh_word = substr($this->text, $i, 3);

$en_write = True;

$i += 3;

}elseif( $ascnum >=192 ){ //高位大于192,utf8规定为2个字节

$zh_word = substr($this->text, $i, 2);

$i+=2;

$en_write = True;

}elseif( $ascnum <= 32 ){

//空字符,英文的空格

$en_write = True;

$i += 1;

}else{

$en_write = False;

$word .= substr($this->text, $i, 1);

$i += 1;

}

if( $en_write && $word != '' ){

$strarr[] = $word;

$word = '';

$en_write = False;

$this->len += 1;

}

if( $zh_word !='' ){

$strarr[] = $zh_word;

$zh_word = '';

$this->len += 1;

}

}

return $this->textarr = $strarr;

}

/**

* 发送文本

*/

public function sendText($text){

$this->text = $text;

$this->initWords();

$this->calInfo();

$this->calEntropy();

}

/**

* 整理词汇,用于后面的凝聚度和信息熵获取

*/

public function calInfo(){

//

if( !isset($this->textarr) ) die("no text");

$newarr = array();

$word = '';

$i = 0;

/*

遍历整个单个文字数组

将所设定的词组阈值之内的所有可能的词进行提取

l=> 左边文字的位置

r=> 右侧文字的位置

c=> 词频

*/

for ($i=0,$len = count($this->textarr); $i

$word = '';

for( $wordlen = 0; $wordlen < $this->maxwordlen; $wordlen++ ){

if( !isset( $this->textarr[$i+$wordlen] ) ) continue;

$word .= $this->textarr[$i+$wordlen];

$newarr[$word]['w'] = $word; //左侧词

$newarr[$word]['l'][] = $i; //左侧词

$newarr[$word]['r'][] = $i+$wordlen; //右侧词

//统计词频

if( !isset($newarr[$word]['c']) ) $newarr[$word]['c'] = 1;

else $newarr[$word]['c'] += 1;

}

}

return $this->wordinfo = $newarr;

}

/**

* 计算信息熵

*/

public function calEntropy(){

foreach ($this->wordinfo as $key => $v) {

$left_entropy = 0;

$right_entropy = 0;

//求左邻字的信息熵,需要大于0才可以

$left_word = array();

//print_r($v);

foreach( $v['l'] as $l ){

if( $l >0 ){

if( !isset($left_word[ $this->textarr[$l-1] ]) )

$left_word[ $this->textarr[$l-1] ] = 1;

else

$left_word[ $this->textarr[$l-1] ] += 1;

}

}

foreach( $left_word as $word=>$num ){

$left_entropy += -($num/$v['c'])*log($num/$v['c']);

}

//求右邻字的信息熵,需要小于整个长度

$right_word = array();

foreach( $v['r'] as $r ){

if( $r < $this->len-1 ){

if( !isset($right_word[ $this->textarr[$r+1] ]) )

$right_word[ $this->textarr[$r+1] ] = 1;

else

$right_word[ $this->textarr[$r+1] ] += 1;

}

}

foreach( $right_word as $word=>$num ){

$right_entropy += -($num/$v['c'])*log($num/$v['c']);

}

//echo $key."--".$left_entropy."--".$right_entropy."\n";

//取坐信息熵和又信息熵里面最小的一个

$entropy = ($left_entropy < $right_entropy) ? $left_entropy : $right_entropy;

$this->wordinfo[$key]['entropy'] = $entropy;

unset($this->wordinfo[$key]['l']);

unset($this->wordinfo[$key]['r']);

}

unset($this->textarr);

return $this->wordinfo;

}

/**

* 对词进行排序,根据信息熵排序

*/

public function sortResult(){

usort($this->wordinfo, array(&$this,'sortByEntropy'));

return $this->wordinfo;

}

private function sortByEntropy($a,$b){

if( $a['entropy'] === $b['entropy'] ) return 0;

return ($a['entropy'] > $b['entropy']) ? -1: 1;

}

}

//应用

header("Content-type:text/html;charset=utf-8");

$smen = memory_get_usage();

$partword = new partword();

$text = "吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮";

$partword->sendText($text);

print_r( $partword->sortResult() );

$emen = memory_get_usage();

echo (($emen - $smen)/1024) ."kb";

?>

赞赏

php短信功能实现原理,基于信息熵原理分词的php实现相关推荐

  1. php可以发短信的代码,PHP代码函数实现PHP发送短信功能

    //PHP代码函数实现PHP发送短信功能 //本代码基于开心洋葱 运行 //代码来源:开心洋葱 //PHP发送短信开心洋葱专用(PHP代码函数) //本代码基于开心洋葱 运行 //代码来源:开心洋葱 ...

  2. iphone计算机打电话,教你在Win10上使用iPhone的电话、短信功能

    协同作业是苹果生态中非常吸引人的功能之一,"Handoff"(接力)让iPhone上没做完的事情可以接着用Mac或iPad继续完成,举例来说当你的iPhone与Mac连接同一Wi- ...

  3. 个人永久性免费-Excel催化剂功能第85波-灵活便捷的批量发送短信功能(使用腾讯云接口)...

    微信时代的今天,短信一样不可缺席,大系统都有集成短信接口. 若只是临时用一下,若能够直接在Excel上加工好内容就可以直接发送,这些假设在此篇批量群发短信功能中都为大家带来完美答案. 业务场景 不多说 ...

  4. python+twilio实现打电话和发短信功能

    python和twilio实现发送短信功能 最近突发奇想,,python能不能实现打电话和发短信,通过查找资料,还真可以, 如果只是用自己的手机打电话的话,可以借助appium这个来实现,原理其实和s ...

  5. linux 短信功能,Android调用系统短信功能发送短信

    Android调用系统短信功能发送短信有两种方法: 第一种,设定发送的号码,和内容,界面没有联系人,群组组等按钮,如下图所示: 代码如下: Uri smsToUri = Uri.parse(" ...

  6. 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓短信功能全解:调用系统短信功能发送短信.彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信. 首先需要 ...

  7. 苹果手机短信html,苹果手机的短信功能你真的会用吗?这样用更省心哦!

    自从即时信息的社交APP如QQ.微信出现之后,很多人对于手机短信的使用频率都在慢慢地减少.原因各种各样,但最重要的原因无非就是觉得能真正解决我们需求的作用越来越小的,这样使用就自然减少了. 虽然使用的 ...

  8. 【短信发送】实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现

    实现腾讯云发送短信功能--工具类和SpringBoot配置两种方法实现 一.开通腾讯云短信服务 二.工具类--使用qcloudsms实现短信发送 三.Spring Boot项目引入短信发送功能 我们发 ...

  9. android 自动发彩信,Android编程实现定时发短信功能示例

    本文实例讲述了Android编程实现定时发短信功能.分享给大家供大家参考,具体如下: 第一,要实现发短信的功能,必须要用到android系统中发短信的权限,即在AndoridManifest.xml中 ...

最新文章

  1. YOLOv4中的tricks概念总结——Bag of freebies
  2. 这个AI能帮你女朋友自拍:从照片生成3D视频,总有个角度让她满意
  3. Java中的图像锐化操作
  4. mysql replace语句
  5. BZOJ1086:[SCOI2005]王室联邦——题解
  6. linux环境切换python3版本
  7. ubuntu下面pycharm设置pyspark的配置
  8. LeetCode 820. 单词的压缩编码(后缀树)
  9. 今晚直播丨2020年全国首场12c OCM直考揭秘
  10. java单例模式 参数_java中的几种单例模式
  11. token的作用_说一说Coin和Token有什么不同
  12. CodeVS 1576 最长严格上升子序列 (DP)
  13. Sql语句对数据库和表的简单操作
  14. html模板替换值,Go语言多值替换的HTML模板实例分析
  15. socket.io实现简单多人聊天室
  16. 关于PHP微信h5棋牌程序开发数据库的备份
  17. linux 嵌入式 快照_Linux下搭建Cortex-M嵌入式开发环境
  18. 跪了!P9透露2021年阿里巴巴Java面试权威指南(泰山版)
  19. 宝哥说币|近期爆火的项目Trister′s Lend究竟有什么发展潜力和前景?
  20. python:爬取租房100页数据

热门文章

  1. excel 设置双坐标轴柱状图
  2. 构建基于MX1919的超声波阵列驱动板
  3. CRMEB单商户标准版上线了!
  4. 中国移动光猫 GM220-S 改桥接简易教程(安徽移动)
  5. Open source licenses
  6. 怎样在ps中制作对话气泡?一招教你轻松解决
  7. Java获取当前时间到凌晨12点剩余秒数
  8. 轻快PDF阅读器下载中文版
  9. kali liunx安装拼音输入法,必须成功,只需5步
  10. Linux:获取线程的PID(TID、LWP)的几种方式