自然語言處理 特徵提取

2021-09-17 20:02:44 字數 4828 閱讀 8253

在語言中,語義的基本單元是單詞。在英語句子中已天然就已經分割成單詞(空白符和標點符號隔開),而在漢語中字和字緊緊的連在一起。所以我們需要進行分詞。分詞有很多種演算法:基於字串匹配演算法、基於理解的演算法、基於統計的演算法(如hmm和n-gram)等。下面重點介紹第一種字串匹配演算法。

分詞的正向最大匹配本質是基於分治和貪婪兩種演算法思想。為了便於理解,我們先講貪婪,後講分治+貪婪。

如果不設立最大處理長度,就是貪婪的思想。具體流程是先以整句為單位,就去詞典匹配。如果匹配不到,則減少句子的長度進行匹配。如果匹配到,則句子的起點後移,繼續遞迴執行,直到整個句子都被若干個詞匹配中(起點超過了句子的長度)。以我愛自然語言處理這句話為例:

1.匹配第乙個詞

1.1 我愛自然語言處理,匹配詞典,不存在。(下一步少乙個字)

1.2 我愛自然語言處,匹配詞典,不存在。(下一步少乙個字)

1.3 我愛自然語言,匹配詞典,不存在。(下一步少乙個字)

1.4 我愛自然語,匹配詞典,不存在。(下一步少乙個字)

1.5 我愛自然,匹配詞典,不存在。(下一步少乙個字)

1.6 我愛自,匹配詞典,不存在。(下一步少乙個字)

1.7 我愛,匹配詞典,不存在。(下一步少乙個字)

1.8 我,匹配詞典,存在。(匹配到第乙個詞)

2.匹配第二個詞

2.1 愛自然語言處理,匹配詞典,不存在。(下一步少乙個字)

2.2 愛自然語言處,匹配詞典,不存在。(下一步少乙個字)

2.3 愛自然語言,匹配詞典,不存在。(下一步少乙個字)

2.4 愛自然語,匹配詞典,不存在。(下一步少乙個字)

2.5 愛自然,匹配詞典,不存在。(下一步少乙個字)

2.6 愛自,匹配詞典,不存在。(下一步少乙個字)

2.7 愛,匹配詞典,存在。(匹配到第二個詞)

3.匹配第三個詞

3.1 自然語言處理,匹配詞典,不存在。(下一步少乙個字)。

3.2 自然語言處,匹配詞典,不存在。(下一步少乙個字)。

3.3 自然語言,匹配詞典,存在。(匹配到第三個詞)。

4.匹配第四個詞

4.1 處理,匹配詞典,存在。(匹配到第四個詞)。

只基於貪婪的方式,在實際工作中是無法使用的,句子一長需要迭代的次數就會非常多。所以需要結合分治的思想進行處理。具體來說就是會設立乙個句子分段擷取長度,比如qweasdzxc(每個字母代表乙個漢字),擷取長度為3,則分為qwe、asd、zxc三個子段。接下來分段進行處理,先處理qwe,如果qwe不在詞典中,則判斷qw在不在詞典中,並把e給相鄰的子段。假如qw在詞典中,則接下來對easd進行上述的運算過程。以我愛自然語言處理為例,擷取長度為4。

將句子分割為我愛自然、語言、處理三個子段。

處理第乙個子段

我愛自然,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

我愛自,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

我愛,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

我,匹配詞典,存在。(匹配到第乙個詞)

處理第二個子段

愛自然語言,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛自然語,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛自然,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛自,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛,匹配詞典,存在。(匹配到第二個詞)

處理第三個子段

自然語言,匹配詞典,存在。(匹配到第三個詞)

處理第四個子段

處理,匹配詞典,存在。(匹配到第四個詞)

反向最大匹配是從後向前選取最大長度的串,從選取串開始向後匹配字典詞,而刪減的也便是左邊的字元。還是以我愛自然語言處理為例,擷取長度為3。為了讓大家理解思想(避免慣性思維),特意展示從最後的子段到第乙個子段進行處理。

將句子分割為我愛自、然語言、處理三個子段。

處理最後乙個子段

處理,匹配詞典,存在。(匹配到第乙個詞)

處理倒數第二個子段

然語言,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

語言,匹配詞典,存在。(匹配到第二個詞)

處理倒數第三個子段

我愛自然,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛自然,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

自然,匹配詞典,存在。(匹配到第三個詞)

處理第倒數第四個子段

我愛,匹配詞典,不存在。(下一步少乙個字,並把少的字加入相鄰子段中)

愛,匹配詞典,不存在。(匹配到第四個詞)

處理第五個子段

我,匹配詞典,存在。(匹配到第五個詞)

可以看到正向最大匹配和反向匹配的結果可能是不同的,而且會受到預設分段長度的影響。

雙向就是結合正向最大和反向最大的結果,對兩個結果進行比較,從而決定正確的分詞方式,當前向和逆向分詞數量不相等的時候,選擇數量較少的那個分詞結果。如果分詞數量相同,則依次比較分詞結果,相應位置如果分詞相同,則選取為最後的結果中,如果相應位置分詞結果不一樣則選取字元較少的那個最為分詞結果。

字元統計**如下所示:

text = '我愛自然語言處理。自然語言處理是乙個很有意思的研究領域'

from collections import counter

c = counter(text)

print(c)

結果如下所示:

counter()

詞頻統計相比字元統計而言,只是多了一步分詞的過程,具體**如下所示:

import jieba 

seg_list = list(jieba.cut('我愛自然語言處理。自然語言處理是乙個很有意思的研究領域。', cut_all=false))

c = counter(seg_list )

print(c)

結果如下所示:

counter()

n-gram是一種基於統計語言模型的演算法。它的思想是將文字裡面的內容按照指定的單元進行大小為n的滑動視窗操作,每次取得長度為n的序列,直到滑窗結束。模型本質上是一種近似,即第n個詞只與前n-1個詞相關。如果指定的單元是字,則可用來做分詞任務。如果指定的單元是詞,則可以計算出整個句子的概率。下面所述的語言模型,都指定單元為詞,而不是字。

unigram等同於詞頻統計,而bigram頻率統計只需要取n-gram,然後傳入到counter()中即可。

分詞工具採用結巴中文分詞,涉及到的演算法:

基於trie樹結構實現高效的詞圖掃瞄,生成句子中漢字所有可能成詞情況所構成的有向無環圖(dag);

採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合;

對於未登入詞,採用了基於漢字成詞能力的hmm模型,使用了viterbi演算法。

結巴中文分詞支援的三種分詞模式包括:

精確模式:試圖將句子最精確地切開,適合文字分析;

全模式:把句子中所有的可以成詞的詞語都掃瞄出來, 速度非常快,但是不能解決歧義問題;

搜尋引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。

具體**如下所示:

import jieba

# 全模式

text = "我愛深度學習的自然語言處理"

seg_list = jieba.cut(text, cut_all=true)

print(u"[全模式]: ", "/ ".join(seg_list))

# 精確模式

seg_list = jieba.cut(text, cut_all=false)

print(u"[精確模式]: ", "/ ".join(seg_list))

# 預設是精確模式

seg_list = jieba.cut(text)

print(u"[預設模式]: ", "/ ".join(seg_list))

# 搜尋引擎模式

seg_list = jieba.cut_for_search(text)

print(u"[搜尋引擎模式]: ", "/ ".join(seg_list))

結果如下所示:

[全模式]: 我/ 愛/ 深度/ 學習/ 的/ 自然/ 自然語言/ 語言/ 處理

[精確模式]: 我/ 愛/ 深度/ 學習/ 的/ 自然語言/ 處理

[預設模式]: 我/ 愛/ 深度/ 學習/ 的/ 自然語言/ 處理

[搜尋引擎模式]: 我/ 愛/ 深度/ 學習/ 的/ 自然/ 語言/ 自然語言/ 處理

注:如果是python3版本,jieba返回的是乙個生成器,需要轉換成列表。

seg_list = list(seg_list)

with open(r'stopwords.txt', 'r', encoding = 'utf-8') as f:

content = f.read()

stop_words = content.split('\n')

from sklearn.feature_extraction.text import countvectorizer

count_vectorizer = countvectorizer(stop_words=stop_words) #上一步的停用詞

count_vectorizer.fit(seg_list)

vec = count_vectorizer.transform(seg_list).toarray()

vocab_list = count_vectorizer.get_feature_names() #得到字典

Python自然語言處理 提取詞幹

在英文中同乙個詞的形式是有多種的,名詞的單數複數 動詞的現在和過去式等等,所以在處理英文時要考慮詞幹的抽取問題。這裡直接呼叫nltk自帶的兩個詞幹抽取器 import re import nltk raw dennis listen,strange women lying in ponds dist...

LBP特徵提取冗餘處理

lbp特徵提取冗餘處理.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include include include include include include using namespace cv using namesp...

自然語言處理

自然語言處理主要步驟包括 2.詞法分析 對於英文,有詞頭 詞根 詞尾的拆分,名詞 動詞 形容詞 副詞 介詞的定性,多種詞意的選擇。比如diamond,有菱形 棒球場 鑽石3個含義,要根據應用選擇正確的意思。3.語法分析 通過語法樹或其他演算法,分析主語 謂語 賓語 定語 狀語 補語等句子元素。4.語...