中文分词--词典分词--最长匹配
生活随笔
收集整理的這篇文章主要介紹了
中文分词--词典分词--最长匹配
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
(個(gè)人學(xué)習(xí)筆記,慎重參考)
1 基本概念
中文分詞
指的是將一段文本拆分為一系列單詞的過(guò)程,這些單詞順序拼接后等于原文本。
作為中文信息處理的第一站,是后續(xù)nlp任務(wù)的基礎(chǔ),中文分詞算法大致可分為詞典規(guī)則與統(tǒng)計(jì)學(xué)習(xí),針對(duì)具體問(wèn)題往往會(huì)以統(tǒng)計(jì)學(xué)習(xí)為主、詞典規(guī)則為輔。
2 正向最長(zhǎng)匹配
最長(zhǎng)匹配算法
就是在以某個(gè)下標(biāo)為起點(diǎn)遞增查詞的過(guò)程中,優(yōu)先輸出更長(zhǎng)的單詞,這種規(guī)則被稱為最長(zhǎng)匹配算法。從前往后匹配則稱為正向最長(zhǎng)匹配,反之則稱為逆向最長(zhǎng)匹配。
# -*- coding:utf-8 -*-from tests.book.ch02.utility import load_dictionarydef forward_segment(text, dic):word_list = []i = 0while i < len(text):longest_word = text[i] # 當(dāng)前掃描位置的單字for j in range(i + 1, len(text) + 1): # 所有可能的結(jié)尾word = text[i:j] # 從當(dāng)前位置到結(jié)尾的連續(xù)字符串if word in dic: # 在詞典中if len(word) > len(longest_word): # 并且更長(zhǎng)longest_word = word # 則更優(yōu)先輸出word_list.append(longest_word) # 輸出最長(zhǎng)詞i += len(longest_word) # 正向掃描return word_listif __name__ == '__main__':dic = load_dictionary()print(forward_segment('就讀北京大學(xué)', dic))print(forward_segment('研究生命起源', dic))運(yùn)行結(jié)果:
['就讀', '北京大學(xué)'] ['研究生', '命', '起源']- 從代碼邏輯可以看出,在匹配到字典中的最長(zhǎng)字符串優(yōu)先輸出,若以該起點(diǎn)的字符中都不在字典中,則該起點(diǎn)的單字作為分詞輸出;
- [‘研究生’, ‘命’, ‘起源’]產(chǎn)生誤差的原因在于,正向最長(zhǎng)匹配“研究生”的優(yōu)先級(jí)大于“研究”,下面采用逆向最長(zhǎng)匹配解決這個(gè)問(wèn)題;
3 逆向最長(zhǎng)匹配
# -*- coding:utf-8 -*- # Author:hankcs # Date: 2018-05-22 21:05 # 《自然語(yǔ)言處理入門(mén)》2.3.3 逆向最長(zhǎng)匹配 # 配套書(shū)籍:http://nlp.hankcs.com/book.php # 討論答疑:https://bbs.hankcs.com/ from tests.book.ch02.utility import load_dictionarydef backward_segment(text, dic):word_list = []i = len(text) - 1while i >= 0: # 掃描位置作為終點(diǎn)longest_word = text[i] # 掃描位置的單字for j in range(0, i): # 遍歷[0, i]區(qū)間作為待查詢?cè)~語(yǔ)的起點(diǎn)word = text[j: i + 1] # 取出[j, i]區(qū)間作為待查詢單詞if word in dic:if len(word) > len(longest_word): # 越長(zhǎng)優(yōu)先級(jí)越高longest_word = wordbreakword_list.insert(0, longest_word) # 逆向掃描,所以越先查出的單詞在位置上越靠后i -= len(longest_word)return word_listif __name__ == '__main__':dic = load_dictionary()print(backward_segment('研究生命起源', dic))print(backward_segment('項(xiàng)目的研究計(jì)劃', dic))運(yùn)行結(jié)果:
['研究', '生命', '起源'] ['項(xiàng)', '目的', '研究計(jì)劃']- [‘研究’, ‘生命’, ‘起源’]分詞正確了,但是[‘項(xiàng)’, ‘目的’, ‘研究計(jì)劃’]又錯(cuò)了,后者用正向最長(zhǎng)匹配可以正確分詞;
4 雙向最長(zhǎng)匹配
- 清華大學(xué)的孫茂松教授曾經(jīng)做過(guò)統(tǒng)計(jì),在隨機(jī)挑選的3680個(gè)句子中,正向匹配錯(cuò)誤而逆向匹配正確的句子占比9.24%9.24\%9.24%,正向匹配正確而逆向匹配錯(cuò)誤的情況則沒(méi)有。
- 基于類似上面觀察到的一些經(jīng)驗(yàn),人們繼續(xù)提出了雙向最長(zhǎng)匹配,具體規(guī)則如下:
(1)同時(shí)執(zhí)行正向和逆向最長(zhǎng)匹配,若兩者的詞數(shù)不同,則返回詞數(shù)更少的那一個(gè);
(2)否則,返回兩者中單字更少的那一個(gè)。當(dāng)單字?jǐn)?shù)也相同時(shí),優(yōu)先返回逆向最長(zhǎng)匹配的結(jié)果;
運(yùn)行結(jié)果:
['研究', '生命', '起源']5 三種算法對(duì)比
- 上圖顯示,雙向最長(zhǎng)匹配的確在2、3、5這3種情況下選擇出了最好的結(jié)果,但在4號(hào)句子上選擇了錯(cuò)誤的結(jié)果,使得最終正確率 3/6 反而小于逆向最長(zhǎng)匹配的 4/6 , 由此,規(guī)則系統(tǒng)的脆弱可見(jiàn)一斑。規(guī)則集的維護(hù)有時(shí)是拆東墻補(bǔ)西墻,有時(shí)是幫倒忙。
6 參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的中文分词--词典分词--最长匹配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python删除重复值所在的行数_pyt
- 下一篇: pygame下载(非常详细)