国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

C語言實現搜索引擎技術之中文分詞

2024-08-27 23:59:25
字體:
來源:轉載
供稿:網友

搜索引擎技術在碼農眼里一直是比較高大上,其中文分詞是中文自然語言處理領域的基礎研究,也是中文搜索引擎的核心模塊之一,現在我們來用C語言簡單實現一下中文搜索引擎中文分詞.

目前而言的分詞系統絕大多數都是基于中文詞典的匹配算法,其中,最為常見的是最大匹配算法(Maximum Matching,以下簡稱MM算法),而MM算法有三種:一種正向最大匹配、一種逆向最大匹配和雙向匹配,本文以正向最大匹配算法為例介紹其基本思想和實現.

一、基本思想

(1)假設詞典中最長的詞語字數為w(一般設置為8個字符,即4個漢字).

(2)判斷帶分詞語句長度是否大于w個字,如果大于w則跳到(3),如果小于w則跳到(6).

(3)取待分詞語句的前w個字。

(4)在詞典中查找w,如果存在,則從語句中去掉w,從語句中w后的詞開始重復上面過程.

(5)如果不存在,就去掉這w個字的最后一個字.

(6)檢查是否是單字或者空,如果是,則退出.

(7)如果不是,則繼續判斷詞庫中是否存在這個詞,如此反復循環,直到輸出一個詞.

(8)繼續取短語的前w個字反復循環,這樣就可以將一個語句分成詞語的組合了.

二、簡單實現,代碼如下:

  1. #include <stdio.h> 
  2. #include <string> 
  3. #include <set> 
  4. using namespace std; 
  5. set<string> g_setWordDictionary; 
  6.  
  7. int construct() 
  8.     g_setWordDictionary.insert("中國"); 
  9.     g_setWordDictionary.insert("中國人"); 
  10.     g_setWordDictionary.insert("紐約"); 
  11.     g_setWordDictionary.insert("北京"); 
  12.  
  13. bool match(string &word) 
  14.     set<string>::iterator itor = g_setWordDictionary.find(word); 
  15.     if (itor == g_setWordDictionary.end()) 
  16.     { 
  17.         return false
  18.     } 
  19.  
  20.     return true
  21.  
  22. void forward_maximum_matching(string content, set<string> &keywords)     
  23.     #define MAX_LEN 12      //詞庫中最長詞語(utf-8一個漢字3個字節) 
  24.     #define MIN_LEN 3       //單字(原理同上) 
  25.     int len = content.length(); 
  26.     int right_len = len; 
  27.     int start_pos = 0; 
  28.     bool ret = false
  29.     string kw_value = ""
  30.     int kw_len = 0; 
  31.     int kw_pos = 0; 
  32.     //單字或空串 
  33.     while (right_len > MIN_LEN) 
  34.     { 
  35.         //語句大于詞庫中最長詞語 
  36.         if (right_len >= MAX_LEN) 
  37.         { 
  38.             kw_value = content.substr(start_pos, MAX_LEN); 
  39.         } 
  40.         //語句小于詞庫中最長詞語 
  41.         else 
  42.         { 
  43.             kw_value = content.substr(start_pos, right_len); 
  44.         } 
  45.  
  46.         //詞庫匹配 
  47.         ret = match(kw_value); 
  48.         kw_len = kw_value.length(); 
  49.         kw_pos = 0; 
  50.         while (!ret && kw_len > 2*MIN_LEN) 
  51.         { 
  52.             //去掉候選詞右邊一個漢字 
  53.             kw_len -= MIN_LEN; 
  54.             kw_value = kw_value.substr(kw_pos, kw_len); 
  55.             //繼續匹配 
  56.             ret = match(kw_value); 
  57.         } 
  58.  
  59.         //匹配到詞 
  60.         if (ret) 
  61.         { 
  62.             keywords.insert(kw_value); 
  63.             //從語句中去掉匹配到的詞 
  64.             start_pos += kw_len; 
  65.             right_len = len - start_pos; 
  66.         } 
  67.         //未匹配到詞,下移一個字 
  68.         else 
  69.         { 
  70.             start_pos += MIN_LEN; 
  71.             right_len = len - start_pos; 
  72.         } 
  73.     }//while (right_len > MIN_LEN)       
  74.  
  75. int main() 
  76.     //構造詞庫 
  77.     construct(); 
  78.  
  79.     //切分詞庫 
  80.     string content = "我是中國人,我是來自中國北京的中國人,在紐約工作"
  81.     set<string> keywords; 
  82.     forward_maximum_matching(content, keywords); 
  83.     set<string>::iterator itor; 
  84.  
  85.     //輸出分詞 
  86.     for (itor=keywords.begin(); itor!=keywords.end(); ++itor) 
  87.     { 
  88.         printf("result: %sn", (*itor).c_str()); 
  89.     }  //Vevb.com 
  90.  
  91.     return 0; 
  92. }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上饶县| 五大连池市| 江北区| 隆子县| 铁岭市| 乐昌市| 霍邱县| 青河县| 安化县| 中西区| 波密县| 安庆市| 清镇市| 大理市| 麦盖提县| 宿松县| 文化| 墨竹工卡县| 靖边县| 兴化市| 临西县| 水富县| 郎溪县| 三河市| 绥芬河市| 衡山县| 宝坻区| 诸暨市| 永泰县| 讷河市| 黄骅市| 蒙山县| 湖口县| 特克斯县| 南京市| 安顺市| 伊通| 漠河县| 桦川县| 什邡市| 新闻|