ホームページ php教程 php手册 分享mysql中文全文搜索:中文分词简单函数

分享mysql中文全文搜索:中文分词简单函数

Jun 07, 2016 am 11:40 AM

分享mysql中文全文搜索:中文分词简单函数
原文地址:http://www.jb100.net/html/content-22-400-1.html
前段时间研究中文全文搜索,结果发现mysql不支持中文的全文搜索。但是有一些解决办法,就是手动把中文单词用空格分开,然后搜索的时候加 上 in boolean mode。 但是这就带来一个问题,就是中文分词。这个是个很大的难题,貌似中科院有个小组就是专门做中文分词技术的。我们用 php来分词的话,要实现真正语义上的分词是非常困难的,就算实现了效率也不高。一般情况下,我们采用的是如下方法分词:

比如我们有一句话:你好我是刘春龙
那么我们可以这样来分词: 你好 好我 我是 是刘 刘春 春龙


这样虽然看起来有点傻,但是实际应用起来确实可行,因为我们搜索时候输入的关键词也是按照这个方法分词。

下面有个我自己写的函数,可以实现这种分词。传入三个参数,分别是:

1.需要分词的字符串,必须,英文,标点,数字,汉字,日语等都可以。编码为UTF-8
2.是否返回字符串,可选,默认是。如果传入false,那么将返回一个数组。
3.是否base64_encode中文,可选,默认是。Mysql的全文搜索有个配置是 ft_min_word_len 这个值一般是4,而 我们分成的中文词语是两个字,就不会被mysql认为是一个词。而base64_encode过后,词语的长度为8,就不存在最小长度问题 了。 base64_encode过后数据量会增大 50%。


注意,这里输入和输出的字符串编码都是UTF-8 function string2words($s,$return_string = true,$encode64 = true) <br> { <br>         $re = ''; <br>         //匹配汉字 <br>         if (preg_match_all("/([x{4e00}-x{9fff}]{2,})/u",$s,$ms)) <br>         { <br>                 foreach($ms[0] as $w) <br>                 { <br>                         //关键部分:分词 <br>                         $l = strlen($w)/3; <br>                         for($i=0;$i                         { <br>                                 $wi = substr($w,$i*3,6); <br>                                 if (strlen($wi) &gt; 3) <br>                                 { <br>                                         $re .= ($encode64)?' '.str_replace(',','@',base64_encode($wi)):' '.$wi; <br>                                 } <br>                         } <br>                 } <br>         } <br>         //匹配数字 <br>         if (preg_match_all("/(d+[.]?d+)/",$s,$ms)) <br>         { <br>                 foreach($ms[0] as $wi) <br>                 { <br>                         if(strlen($wi) &gt;= 2) <br>                         { <br>                                 $re .= ($encode64)?' '.str_replace(',','@',base64_encode($wi)):' '.$wi; <br>                         } <br>                 } <br>                 $s = preg_replace("/(d+[.]?d+)/",' ',$s); <br>         } <br>         //去掉所有双字节字符 <br>         $s = preg_replace("/([^x{00}-x{ff}]+)/u",' ',$s); <br>         $re = $s.' '.$re; <br>         if (!$return_string) <br>         { <br>                 $re = preg_replace("/([^d])([,.-?n])([^d])/",'$1 $3',$re); <br>                 $re = trim(preg_replace("/[s]{2,}/",' ',$re)); <br>                 $arr = explode(' ',$re); <br>                 $re = array(); <br>                 foreach($arr as $a) <br>                 { <br>                         if (strlen($a) &gt;= 2) $re[] = $a; <br>                 } <br>                 return $re; <br>         } <br>         else <br>         { <br>                 $re = trim(preg_replace("/[s,.]{2,}/",' ',$re)); <br>                 return $re; <br>         } <br> } 原文地址:http://www.jb100.net/html/content-22-400-1.html

AD:真正免费,域名+虚机+企业邮箱=0元

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python プログラミングの入門コード例について学びます。 Python プログラミングの入門コード例について学びます。 Jan 04, 2024 am 10:50 AM

Python プログラミングの入門コード例について学びます。

PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法 PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法 Aug 06, 2023 pm 04:49 PM

PHPを使用して在庫管理システムに在庫管理機能コードを記述する方法

PHP 変数の実際の使用: 10 の実際の使用例 PHP 変数の実際の使用: 10 の実際の使用例 Feb 19, 2024 pm 03:00 PM

PHP 変数の実際の使用: 10 の実際の使用例

Java は単純なバブルソートコードを実装します Java は単純なバブルソートコードを実装します Jan 30, 2024 am 09:34 AM

Java は単純なバブルソートコードを実装します

Go 言語プログラミングの例: Web 開発のコード例 Go 言語プログラミングの例: Web 開発のコード例 Mar 04, 2024 pm 04:54 PM

Go 言語プログラミングの例: Web 開発のコード例

Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例 Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例 Jul 05, 2023 pm 09:57 PM

Huawei Cloud Edge Computing Interconnection Guide: インターフェースを迅速に実装するための Java コード例

初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装 初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装 Mar 04, 2024 pm 03:09 PM

初心者から熟練者まで: Go 言語で一般的に使用されるデータ構造のコード実装

ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。 ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。 Feb 18, 2024 am 10:52 AM

ガイダンスと例: Java で選択ソート アルゴリズムを実装する方法を学習します。

See all articles