在下面的教程中,我們將了解使用 Python 編程語言中的 NLTK(自然語言工具包)包來詞幹的過程。
詞幹學導論
詞幹是自然語言處理流水線過程的重要組成部分。詞幹是生成詞根/基本詞的形態修改的過程。詞幹程序通常被認為是詞幹算法或詞幹分析器。詞幹算法將“檢索”、“檢索”、“檢索”等詞簡化為詞根詞,將“檢索”和“蟲火谷”、“巧克力”、“巧克力”等詞簡化為詞幹“巧克力”。詞幹分析器的輸入是分詞的單詞。但是這些符號化的單詞從何而來呢?分詞包括將文檔分解成不同的單詞。要了解更多關於分詞的知識,可以參考關於“Python 中的分詞”的教程。
現在讓我們理解詞幹中的錯誤。
理解詞幹中的錯誤
詞幹錯誤主要分為兩類:
- 過詞幹:當兩個詞來源於不同詞幹的同一個詞根時,就會出現這個錯誤。過度堵塞也可以被視為誤報。
- 詞幹不足:當兩個單詞來自同一個詞根而不是不同的詞幹時,會出現此錯誤。詞幹不足也可以被認為是假陰性。
現在讓我們看看詞幹的一些應用。
理解詞幹的應用
詞幹的一些應用如下:
- 我們可以在信息恢復系統中使用詞幹作為搜索引擎。
- 我們也可以使用詞幹來確定領域分析中的領域詞彙。
- 一個有趣的事實是,谷歌搜索在 2003 年採用了詞幹。以前搜索“魚”不會返回“魚”或“捕魚”。
理解詞幹算法
一些詞幹算法如下:
- 波特的斯特梅爾算法
- 愛之聲
- 道森准下士同意
- krovetz stemmer 先生
- 施樂之聲
- N-Gram Voices
- 雪球斯特梅爾
- 蘭開斯特 投票
現在讓我們簡單討論一下這些詞幹算法。
波特的斯特梅爾算法
波特的斯特梅爾算法是 1980 年提出的著名詞幹方法之一。這個概念是基於這樣一個原則,即英語中的後綴是由更小更簡單的後綴組合而成的。這種詞幹分析器因其速度快和簡單而受歡迎。波特·斯特梅爾的主要應用包括數據挖掘和數據恢復。然而,這些應用僅限於英語單詞。而且,詞幹組映射到同一個詞幹上,輸出的詞幹不一定是有意義的詞。這些算法相當長,被稱為最古老的詞幹分析器。
假設 EED -> EE 的意思是“如果這個單詞至少有一個元音和輔音加上 EED 結尾,把結尾改成 EE”,因為‘同意’變成了‘同意’。
優勢:與其他詞幹分析器相比,它產生的輸出最好,錯誤率更低。
限制:產生的形態修飾並不總是真實的單詞。
愛之聲
它是由 Lovins 在 1968 年提出的,從一個單詞中刪除最長的後綴,然後記錄這個單詞,以便將這個詞幹轉換成有效的單詞。
例如,坐着->坐着->坐着
優勢:洛文斯斯特梅爾速度快,管理不規則複數。比如‘牙’和‘牙’等。
限制:這個過程很耗時,經常無法從詞幹中形成單詞。
道森准下士同意
它是 Lovins 詞幹分析器的一個擴展,其中後綴按照長度和最後一個字母的反向順序進行索引。
優勢:道森斯特梅爾的處決速度快,覆蓋面更足。
限制:實現非常複雜。
krovetz stemmer 先生
羅伯特·克羅威茨於 1993 年提出了克羅威茨·斯特梅爾。該詞幹算法遵循如下所示的一些步驟:
- 將單詞的複數形式轉換為單數形式。
- 把一個單詞的過去時轉換成現在時,去掉後綴“ing”。
例如,“兒童”->“兒童”
優勢: Krovetz 斯特梅爾比較輕,我們可以把它作為其他詞幹器的前置詞幹器。
限制:這種詞幹算法在大文檔的情況下效率很低。
施樂之聲
施樂斯特梅爾能夠管理大數據,並能生成有效的單詞。然而,過度詞幹是很高的,因為它對詞彙的依賴使它依賴於語言。因此,這種詞幹算法的主要限制是它是特定於語言的。
例如:
孩子->孩子
理解->理解
誰->誰
最佳->好
N-Gram Voices
N-Gram 是從一個單詞中提取的n
個連續字符的集合,其中相似的單詞通常具有高比例的 N-Gram。
例如,n = 2 的“INTRODUCTIONS”變為:I、IN、NT、TR、RO、OD、DU、UC、CT、TI、IO、ON、NS、S
優勢:該詞幹算法基於字符串比較,並且依賴於語言。
限制:創建和索引 n 克需要空間,時間效率不高。
雪球斯特梅爾
與波特·斯特梅爾不同,雪球斯特梅爾也能映射非英語單詞。由於這個詞幹算法支持多種語言,我們可以稱雪球斯特梅爾為多語言詞幹。雪球莖幹器也是從 NLTK 包中導入的。這種算法基於一種被稱為“雪球”的編程語言,該語言處理小字符串,是斯特梅爾使用最廣泛的語言。這個詞幹算法比波特斯特梅爾更激進,也被認為是波特 2 斯特梅爾。由於與波特斯特梅爾相比有所改進,雪球莖幹分析器的計算速度非常快。
蘭開斯特 投票
與其他兩種算法相比,蘭開斯特詞幹分析器更具攻擊性和動態性。該詞幹算法速度快;然而,它在處理小詞時令人困惑。然而,沒有像雪球莖幹一樣高效。蘭卡斯特詞幹分析器從外部保存規則,並從根本上利用迭代算法。
現在,讓我們看看使用 Python 編程語言中的 NLTK 包來實現詞幹。
Python 中詞幹的實現
讓我們考慮下面的例子,用 Python 中的 NLTK 包演示詞幹的實現。
示例:
# importing the required modules
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
# creating an object of the PorterStemmer class
pStemmer = PorterStemmer()
# selecting some words to be stemmed
list_of_words = ["consult", "consultant", "consulting", "consultantative", "consultants", "consulting"]
for words in list_of_words:
print(words + ": " + pStemmer.stem(words))
輸出:
consult: consult
consultant: consult
consulting: consult
consultantative: consult
consultants: consult
consulting: consult
說明:
在上面的代碼片段中,我們已經導入了所需的模塊。然後我們創建了一個 NLTK 包的 PorterStemmer 類的對象。然後,我們創建了一個需要詞幹的單詞列表。最後,我們使用循環的來遍歷列表中的單詞,並使用詞幹()函數對它們進行詞幹處理。
我們可以觀察到,在上面的例子中,我們沒有使用 word_tokenize() 函數。讓我們考慮另一個使用 word_tokenize() 函數演示詞幹的例子。
示例:
# importing the required modules
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenize
# creating an object of the PorterStemmer class
pStemmer = PorterStemmer()
# given sentence
sentence = "People comes to consultants office to consult the consultant"
# tokenizing the sentence
list_of_words = word_tokenize(sentence)
for words in list_of_words:
print(words, " : ", pStemmer.stem(words))
輸出:
People : peopl
comes : come
to : to
consultants : consult
office : offic
to : to
consult : consult
the : the
consultant : consult
說明:
在上面的代碼片段中,我們已經導入了所需的模塊,並創建了一個 PorterStemmer 類的對象。然後,我們定義了一個必須進行詞幹處理的字符串。然後,我們使用了 word_tokenize() 函數來標記句子。最後,我們使用循環的來遍歷單詞列表,並使用詞幹()函數來詞幹。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301662.html