1. 程式人生 > >新詞發現(一):基於統計

新詞發現(一):基於統計

1. 什麼是新詞

現在大部分的分詞工具已經做到了準確率高、粒度細,但是對於一些新詞(new word)卻不能做到很好地識別,比如:

快的打車優惠券
英雄聯盟怎麼不可以打排位

“快的”、“英雄聯盟”應該被作為一個詞,卻被切成了兩個詞,失去了原有的語義。未登入詞(out-of-vocabulary, OOV)籠統地之未在詞典中出現的詞,序列標註方法HMM與CRF可以根據上下文很好地識別未登入詞,但是這種模型缺乏領域自適應能力 [1]:

模型對訓練語料所在領域的語言現象處理可能表現出較好的效能,但一旦超出領域範圍或測試集與訓練樣本有較大差異,模型效能將大幅度下降。例如,在標註的大規模《人民日報》分詞語料上訓練出來的漢語詞語自動切分模型的準確率可達96%左右,甚至更高,但在微博等非規範文字基礎上訓練出的分詞效能至少要低5個百分點左右。在LDC漢語樹庫上訓練出來的句法分析系統準確率可達86%左右,但在非規範網路文字上的分析準確率只有60%左右(宗成慶 2013)。統計模型對領域自適應能力的缺乏嚴重製約了該方法的應用。

因此,對於“快的”、“英雄聯盟”這樣最近才出來的詞未能識別。我們定義新詞為具有基本詞彙所沒有的新形式、新語義的詞語。新詞可以視作一種特殊的未登入詞;從分詞的角度來看,新詞一般表現為細粒度切分後相鄰詞的組合。

2. 基於統計的新詞發現

演算法

Matrix67提出了一種基於資訊熵的新詞發現演算法[2],成詞的標準有兩個:

  • 內部凝固度
  • 自由運用程度

所謂內部凝固度,用來衡量詞搭配(collocation)是否合理。比如,對於“的電影”、“電影院”這兩個搭配,直觀上講“電影院”更為合理,即“電影”和“院”凝固得更緊一些。在計算語言學中,PMI (Pointwise mutual information)被用來度量詞搭配與關聯性,定義如下:

\[ pmi(x,y) = \log \frac{P(x,y)}{P(x)P(y)} \]

若PMI高,即兩個詞共現(co-occurrence)的頻率遠大於兩個詞自由拼接的乘積概率,則說明這兩個詞搭配更為合理一些。針對一個詞有多種搭配組合,比如“電影院”可以由“電影”+“院”構成,也可以由“電”+“影院”構成,Matrix67取其所有pmi最小值(去掉log)作為內部凝固度:

\[ solid(c_1^m) = \min \frac{P(c_1^m)}{\prod P(c_i^j)} = \frac{P(c_1^m)}{\max \prod P(c_i^j)} \]

其中,\(c_1^m=c_1c_2\cdots c_m\)

表示長度為\(m\)的字串,\(P(c_1^m)\)表示詞\(c_1^m\)的頻率。

光看文字片段內部的凝合程度還不夠,我們還需要從整體來看它在外部的表現。考慮“被子”和“輩子”這兩個片段。我們可以說“買被子”、“蓋被子”、“進被子”、“好被子”、“這被子”等,在“被子”前面加各種字;但“輩子”的用法卻非常固定,除了“一輩子”、“這輩子”、“上輩子”、“下輩子”,基本上“輩子”前面不能加別的字了。“輩子”這個文字片段左邊可以出現的字太有限,以至於直覺上我們可能會認為,“輩子”並不單獨成詞,真正成詞的其實是“一輩子”、“這輩子”之類的整體。

所以,Matrix67提出了自由運用程度,用以衡量一個詞的左鄰字與右鄰字的豐富程度。正好資訊熵可以完美地詮釋了這種豐富程度,熵越大則豐富程度越高。“被子”和“輩子”這兩個片段的左鄰字熵le與右鄰字熵re分別如下:

le(被子) = 3.67453
re(被子) = 3.8740
le(輩子) = 1.25963
re(輩子) = 4.11644

可以看出,“被子”的左鄰字熵與右鄰字熵都較高,而“輩子”的左鄰字熵較小,即左鄰字非常貧乏。因此,“被子”較“輩子”更有可能成詞。自由運用程度的定義如下:

\[ free(c_1^m) = \min \{ le(c_1^m), \ re(c_1^m) \} \]

給頻數、內部凝固度與自由運用程度設定一個閾值,提取出來符合閾值的候選詞,去掉詞典中存在的詞即為新詞了。知乎在做反作弊挖掘新詞時,也是採用的這個方法,據說取得了比較好的效果;具體細節參看專欄文章《反作弊基於左右資訊熵和互資訊的新詞挖掘》。該新詞發現演算法已經有Java版實現dict_build,還有Python版實現ChineseWordSegmentation

評估

為了評估該演算法的效果,我採用的策略如下:首先用dict_build對語料進行統計分析得到一批候選詞,然後使用Jieba對語料進行分詞得到詞表,最從候選詞中篩出不在分詞詞表的作為新詞,並按dict_build的成詞概率進行排序。

import codecs

import jieba

seg_words = set()
candidate_words = []

with codecs.open(data_path, 'rb', 'utf-8') as fr:
    for line in fr.readlines():
        strs = line.strip().split('\t')
        if len(strs) == 5:
            candidate_words.append([strs[0], float(strs[4])])
    candidate_words.sort(key=lambda t: t[1], reverse=True)

with codecs.open(file_path, 'rb', 'utf-8') as fr:
    for content in fr.readlines():
        words = jieba.cut(content.strip())
        for word in words:
            seg_words.add(''.join(word))

for wf in candidate_words:
    if wf[0] not in seg_words:
        print(wf)

《西遊記》的Top 32新詞如下:

睜睛 我徒弟 我師弟 老爺們 金光寺 金頭揭諦 金聖娘娘 攙著
扯著 拖著 敲著 揪著 躧著 我師父 老師父 坐著
又遇 又吩咐 那袈裟 捧著 又到 打到 抱著 請師父
八戒沙僧 請唐僧 擡頭見 又來 我佛如來 跳起來 走將來 請如來

採用京東商品標題的語料,Top 36新詞如下:

粗跟短靴 粗跟女靴 粗跟過膝靴 歐式客廳 歐式餐廳 歐式臥室 歐美女靴 踩腳褲
踩腳打底褲 阿羅褲 踩腳保暖褲 踩腳一體褲 韓版休閒褲 韓版小腳褲 唐裝男褲 歐式田園
韓式田園 戚風蛋糕 韓版鬆糕 剃鬚刀片 雙層玻璃杯 雙貔貅 雙層水杯 陸戰靴
抽紙盒 抽象客廳 錢貔貅 遮光臥室 遮光客廳 遮肚罩衫 白酒杯 白雪公主裙
紫砂杯 紫砂茶杯 紫砂品茗杯 紫砂杯茶杯

觀察分析兩組發掘的新詞,總結如下:

  • 一些新詞是有意義、有價值的,比如:“睜睛”、“金光寺”、“金頭揭諦”、“剃鬚刀片”、“紫砂杯”等;
  • 存在部分新詞應該被切分成兩個詞或多個詞,比如:“我徒弟”、“那袈裟”、“唐裝男褲”、“紫砂杯茶杯”等;
  • 還有極少的新詞完全是錯誤的、沒有意義的,比如:“走將來”、“錢貔貅”等,為詞的結尾與下一個詞的拼接。

總體上來看,基於統計的新詞發現演算法是很強的baseline,具有普適性——對於不同領域的語料,能夠發掘出我們想要的新詞;但是同時也帶來很多髒詞。

3. 參考資料

相關推薦

新詞發現基於統計

1. 什麼是新詞 現在大部分的分詞工具已經做到了準確率高、粒度細,但是對於一些新詞(new word)卻不能做到很好地識別,比如: 快的打車優惠券 英雄聯盟怎麼不可以打排位 “快的”、“英雄聯盟”應該被作為一個詞,卻被切成了兩個詞,失去了原有的語義。未登入詞(out-of-vocabulary, OOV)

真實感海洋的繪制基於統計學模型的水面模擬方法詳解

最簡 自動生成 nbsp imu gif bubuko fourier div img 真實感海洋的繪制(一):基於統計學模型的水面模擬方法詳解 學習了基本的OpenGL和圖形學知識後,第一個想做的事情就是畫水(笑),因為對我而言各種遊戲裏面往往最令人印象深刻的就是那波光粼

API 限流器基於redis的API訪問頻率控制器的實現

 在open API日益盛行的今天,API的訪問頻率控制尤為重要。Google開源的Guava中有個類叫RateLimiter,但是此類控制粒度只是秒級別的,沒有提供分鐘,小時,天級別的限制,而且採取的是阻塞的模式,應用起來不是很方便。本人依據Redis的有序集合開發了一個訪

API 系列教程基於 Laravel 5.5 構建 和 測試 RESTful API

隨著移動開發和 JavaScript 框架的日益流行,使用 RESTful API 在資料層和客戶端之間構建互動介面逐漸成為最佳選擇。 在本系列教程中,將會帶領大家基於 Laravel 5.5 來構建並測試帶認證功能的 RESTful API。 RESTful API 先要了解什麼是

分散式鎖基於redis的分散式鎖實現

隨著業務越來越複雜,應用服務都會朝著分散式、叢集方向部署,而分散式CAP原則告訴我們,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分割槽容錯性),三者不可得兼。很多場景中,需要使用分散式事務、分散式鎖等技術來

Elasticsearch搜尋詳解基於 url 的搜尋

簡單的查詢 假如有個 customer 的索引(index),最簡單的查詢是 GET /customer/_search?q=iphone 上面的例子將搜尋 customer 索引,返回所有欄位中包含 iPhone 的文件 這個查詢只有一個引數 q,也就是查詢關鍵字。

細說linux IPC基於socket的程序間通訊

    【版權宣告:尊重原創,轉載請保留出處:blog.csdn.net/shallnet 或 .../gentleliu,文章僅供學習交流,請勿用於商業用途】     在一個較大的工程當中,一般都會有多個程序構成,各個功能是一個獨立的程序在執行。既然多個程序構成一個工程,

分類問題SVM(Python——基於skearn實現鳶尾花資料集分類)

第一步: # -*- coding: utf-8 -*- """ Created on Fri Sep 21 14:26:25 2018 @author: bd04 """ # !/usr/bin/env python # encoding: utf-8 __auth

Spring Cloud使用Eureka進行服務註冊與發現

作為分散式架構開發的一種選擇,Spring Cloud利用Spring Boot的開發便利性巧妙地簡化了分散式系統基礎設施的開發,如服務發現註冊、配置中心、訊息匯流排、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring Cl

統計學習方法筆記K近鄰法的實現kd樹

  實現k近鄰演算法時,首要考慮的問題是如何對訓練資料進行快速的k近鄰搜尋。這點在特徵空間的維數大於訓練資料容量時尤為重要。 構造kd樹   kd 樹是一種對k為空間中的例項點進行儲存的一邊對其進行快速檢索的樹形資料結構。kd樹是二叉樹,表示對k維空間的一個劃分(parti

概率論與數理統計教你步步推貝葉斯公式

參考資料:《概率論與數理統計》 陳希孺  2000.3/2016.8 1,概率是什麼?      概率是表示某種情況出現的可能性大小的一種數量指標,它介於0和1之間。 概

微服務理論系列服務發現四問四答

        在開始之前,我們先來回顧下業內對於微服務架構的定義。簡單來說,微服務就是用一組小服務的方式來構建一個應用,服務獨立執行在不同的程序中,服務之間通過輕量的通訊機制(如 RESTful 介面)來互動,並且服務可以通過自動化部署方式獨立部署。  

機器學習統計學習問題概述

學習:“如果一個系統能夠通過執行某個過程改進它的效能,這就是學習。”按照這一觀點,統計學習就是計算機系統通過運用資料及統計方法提供系統性能的機器學習。 機器學習的物件是資料,它從資料出發,提取資料特徵,抽象出資料模型,發現數據中的知識,又回到對資料的分析和預測

機器學習實驗基於WiFi fingerprints用自編碼器(Autoencoders)和神經網路(Neural Network)進行定位_2(keras版)

Epoch 1/20 6s - loss: 0.7049 Epoch 2/20 6s - loss: 0.6808 Epoch 3/20 5s - loss: 0.6752 Epoch 4/20 5s - loss: 0.6724 Epoch 5/20 5s - loss: 0.6703 Epoch 6/2

基於詞彙樹的影象檢索詞彙樹

從今天起準備把我的畢設的實現細節寫到部落格裡面,一方面寫一遍加深記憶,另一方面如果哪天忘記了查起來也方便 畢設題目是基於詞彙樹的無序影象集檢索和支撐結構生成,其實提出詞彙樹那篇文章(Scalable Recognition with a Vocabulary Tree[1

Pomelo網易開源基於 Node.js 的遊戲服務端框架

  Pomelo 是基於 Node.js 的高效能、分散式遊戲伺服器框架。它包括基礎的開發框架和相關的擴充套件元件(庫和工具包),可以幫助你省去遊戲開發枯燥中的重複勞動和底層邏輯的開發。Pomelo 不但適用於遊戲伺服器開發, 也可用於開發高實時 Web 應用,它的分散式架構可以使 Pomelo 比普通

金融市場量化交易配對策略尋找配對股票基於聚寬python2.7平臺

需要基礎金融理論知識、python numpy、pandas庫知識量化交易以先進的數學模型替代人為的主觀判斷,利用計算機技術從龐大的歷史資料中海選能帶來超額收益的多種“大概率”事件以制定策略,極大地減少了投資者情緒波動的影響,避免在市場極度狂熱或悲觀的情況下作出非理性的投資決

基於docker部署的微服務架構服務註冊中心

前言 微服務架構解決方案使用 spring cloud ,由於spring cloud目前版本迭代非常快,bug也有不少,這裡以目前最新的版本 Camden.SR2 為例。 spring cloud netflix套件 spring cloud net

Idea建立spring cloud服務的註冊與發現

一、spring cloud簡介spring cloud 為開發人員提供了快速構建分散式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件匯流排、全域性鎖、決策競選、分散式會話等等。它執行環境簡單,可以在開發人員的電腦上跑。另外說明spring cloud是基

影象配準】基於灰度的模板匹配演算法MAD、SAD、SSD、MSD、NCC、SSDA、SATD演算法

簡介:        本文主要介紹幾種基於灰度的影象匹配演算法:平均絕對差演算法(MAD)、絕對誤差和演算法(SAD)、誤差平方和演算法(SSD)、平均誤差平方和演算法(MSD)、歸一化積相關演算法(NCC)、序貫相似性檢測演算法(SSDA)、hadamard變換演算法(