文本預(yù)處理是自然語(yǔ)言處理中非常重要的一步,它是為了使得文本數(shù)據(jù)能夠被機(jī)器學(xué)習(xí)模型所處理而進(jìn)行的一系列操作。其中,去除停用詞、詞形還原、詞干提取等技巧是比較常用的。本文將介紹這些技巧的原理,并提供使用Python實(shí)現(xiàn)的代碼示例,幫助讀者更好地理解和實(shí)踐。
1.停用詞
停用詞指在自然語(yǔ)言文本中非常常見(jiàn)的單詞,它們通常不攜帶特定含義,例如“the”、“a”、“an”、“in”等。在文本分析中,這些詞語(yǔ)可能會(huì)干擾模型的訓(xùn)練效果,因此需要將它們從文本中移除。
在Python中,我們可以使用nltk庫(kù)來(lái)完成停用詞的去除。nltk中已經(jīng)包含了一些常用的停用詞列表,我們可以直接使用它們。
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
上述代碼首先下載了nltk中的停用詞列表,然后使用了英文的停用詞列表。使用時(shí),我們可以遍歷文本中的所有單詞,判斷它是否為停用詞。如果是,就將它從文本中移除。
text = "this is an example sentence to remove stop words"
words = text.split()
filtered_words = [word for word in words if word.lower() not in stop_words]
filtered_text = " ".join(filtered_words)
print(filtered_text)
上述代碼中,我們首先將文本分成單詞,然后遍歷每個(gè)單詞。如果單詞不是停用詞,就將其加入到一個(gè)新的列表中。最后,我們將新的列表中的單詞重新拼接成一個(gè)新的文本。
除了英文停用詞之外,中文也有很多常用的停用詞。中文停用詞的特點(diǎn)是數(shù)量較多,而且由于中文詞匯結(jié)構(gòu)比英文復(fù)雜,所以中文停用詞的判斷也更加困難。
在中文文本中,一些通用的停用詞包括:“的”、“了”、“和”、“是”、“在”、“有”、“不”、“我”、“他”、“你”等。這些詞出現(xiàn)的頻率很高,但在文本分析中通常沒(méi)有什么意義。
常見(jiàn)的中文停用詞表可以在網(wǎng)上下載,例如中文停用詞表:https://github.com/goto456/stopwords。
在Python中,我們可以將中文停用詞存儲(chǔ)在一個(gè)列表中,然后在分詞后對(duì)文本進(jìn)行處理,去掉其中的停用詞。以下是一個(gè)使用中文停用詞的代碼示例:
import jieba
# 加載中文停用詞表
stopwords_path = 'path/to/stopwords.txt'
with open(stopwords_path, 'r', encoding='utf-8') as f:
stopwords = [line.strip() for line in f.readlines()]
# 分詞并去除停用詞
text = '今天天氣真好,適合出去玩。'
words = jieba.cut(text)
clean_words = [word for word in words if word not in stopwords]
print(clean_words)
輸出結(jié)果為:
['今天', '天氣', '真好', '適合', '出去', '玩']
在這個(gè)示例中,我們使用jieba庫(kù)對(duì)文本進(jìn)行分詞,并去掉了其中的停用詞。
2.詞形還原
詞形還原 (Lemmatization) 是指將單詞轉(zhuǎn)換為它們的原始形式,這個(gè)原始形式稱為詞元 (Lemma) 或基本形式 (Base form)。與詞干提取不同,詞形還原會(huì)考慮單詞的上下文語(yǔ)境和詞性,因此得到的結(jié)果更加準(zhǔn)確。
詞形還原的處理步驟包括:
- 利用分詞技術(shù)將文本轉(zhuǎn)換為單詞列表。
- 利用詞性標(biāo)注技術(shù)為每個(gè)單詞標(biāo)注詞性。
- 根據(jù)每個(gè)單詞的詞性和上下文語(yǔ)境,將單詞還原為它們的原始形式。
在自然語(yǔ)言處理中,常用的詞形還原算法有基于規(guī)則的和基于統(tǒng)計(jì)的兩種。其中基于規(guī)則的算法使用預(yù)定義的規(guī)則將單詞還原為它們的原始形式,而基于統(tǒng)計(jì)的算法則根據(jù)語(yǔ)料庫(kù)中單詞的出現(xiàn)頻率和上下文語(yǔ)境來(lái)推斷單詞的原始形式。
下面是一個(gè)使用Python的nltk庫(kù)進(jìn)行詞形還原的例子:
import nltk
from nltk.stem import WordNetLemmatizer
nltk.download('wordnet')
wordnet_lemmatizer = WordNetLemmatizer()
text = "My cat is walking on the carpet"
tokens = nltk.word_tokenize(text)
result = []
for token in tokens:
result.append(wordnet_lemmatizer.lemmatize(token, pos='v'))
print(result)
在上述代碼中,我們首先使用nltk庫(kù)的word_tokenize()函數(shù)將文本轉(zhuǎn)換為單詞列表。然后,我們創(chuàng)建了一個(gè)WordNetLemmatizer對(duì)象,并使用它的lemmatize()方法將單詞還原為它們的原始形式。在這個(gè)例子中,我們將單詞還原為它們的動(dòng)詞原形。輸出結(jié)果為:[‘My’, ‘cat’, ‘be’, ‘walk’, ‘on’, ‘the’, ‘carpet’]。
在實(shí)際應(yīng)用中,詞形還原通常與停用詞去除、詞干提取等技術(shù)結(jié)合使用,以提高文本預(yù)處理的效果。
在中文中,詞形變化相對(duì)英文單詞較少,但是詞語(yǔ)之間的組合方式比較靈活,同一個(gè)詞可能會(huì)有多種不同的形態(tài)。中文的詞形還原與英文略有不同,它通常指的是將詞語(yǔ)的不同形態(tài)轉(zhuǎn)換為它的原始形態(tài)。例如,將“吃飯了”和“吃了飯”都還原為“吃飯”。
中文詞形還原的實(shí)現(xiàn)通常需要借助中文分詞技術(shù)和詞性標(biāo)注技術(shù)。中文分詞是將一段文本分解成詞語(yǔ)的過(guò)程,而詞性標(biāo)注是對(duì)每個(gè)詞語(yǔ)進(jìn)行詞性標(biāo)記的過(guò)程。通過(guò)這兩個(gè)步驟,我們可以識(shí)別出每個(gè)詞語(yǔ)的原始形態(tài),并將其還原。
下面是一個(gè)使用中文分詞庫(kù)jieba和詞性標(biāo)注庫(kù)pynlpir進(jìn)行中文詞形還原的示例代碼:
import jieba
import pynlpir
# 加載停用詞表
stopwords = []
with open('stopwords.txt', 'r', encoding='utf-8') as f:
for line in f:
stopwords.append(line.strip())
# 初始化分詞庫(kù)和詞性標(biāo)注庫(kù)
jieba.initialize()
pynlpir.open()
def lemmatize_chinese(text):
"""
中文詞形還原函數(shù),輸入為一段中文文本,輸出為還原后的文本。
"""
words = jieba.cut(text)
lemmatized_words = []
for word in words:
if word not in stopwords: # 去除停用詞
pos = pynlpir.segment(word)[0][1] # 獲取詞性
if pos.startswith('n'): # 名詞
lemmatized_words.append(pynlpir.noun_lemmatize(word))
elif pos.startswith('v'): # 動(dòng)詞
lemmatized_words.append(pynlpir.verb_lemmatize(word))
else:
lemmatized_words.append(word)
return ''.join(lemmatized_words)
# 測(cè)試
text = "今天天氣不錯(cuò),適合去散步。"
lemmatized_text = lemmatize_chinese(text)
print(lemmatized_text)
在上面的代碼中,我們使用了jieba分詞庫(kù)對(duì)中文文本進(jìn)行分詞,然后使用pynlpir詞性標(biāo)注庫(kù)獲取每個(gè)詞語(yǔ)的詞性。最后,根據(jù)詞性使用pynlpir的名詞還原和動(dòng)詞還原方法進(jìn)行詞形還原。需要注意的是,在中文中,名詞和動(dòng)詞的還原方法通常是不同的。
3.詞干提取
詞干提?。╯temming)是另一種文本預(yù)處理技術(shù),它試圖從單詞中去除詞綴,使得詞干可以被識(shí)別為同一單詞的變體。它的目的是將一個(gè)單詞的各種變體歸并為同一個(gè)詞干,這樣可以減少單詞形態(tài)變化帶來(lái)的干擾,同時(shí)縮小特征空間的規(guī)模。
與詞形還原不同,詞干提取僅僅是將單詞的后綴去掉,而不考慮其上下文和語(yǔ)法,因此可能會(huì)產(chǎn)生一些無(wú)意義的詞干。
對(duì)于英文單詞,Porter stemming算法是最常用的詞干提取算法。
import nltk
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
word_list = ['running', 'runner', 'ran', 'runs']
for word in word_list:
print(f"Stemming '{word}' results in '{stemmer.stem(word)}'")
輸出結(jié)果如下所示:
Stemming 'running' results in 'run'
Stemming 'runner' results in 'runner'
Stemming 'ran' results in 'ran'
Stemming 'runs' results in 'run'
可以看到,PorterStemmer將所有單詞都轉(zhuǎn)換為它們的詞干形式,但這并不總是符合語(yǔ)法規(guī)則,因?yàn)樗皇菓?yīng)用了一些簡(jiǎn)單的規(guī)則和規(guī)律。在某些情況下,它可能會(huì)將不同的單詞轉(zhuǎn)換為相同的詞干,或?qū)⑾嗤膯卧~轉(zhuǎn)換為不同的詞干。因此,在使用詞干提取時(shí),需要根據(jù)特定的應(yīng)用場(chǎng)景和數(shù)據(jù)集來(lái)決定是否使用它。
對(duì)于中文,中文的分詞就可以看作是詞干提取的過(guò)程。中文分詞將句子劃分為詞語(yǔ)的序列,這些詞語(yǔ)是語(yǔ)言中最小的、能夠獨(dú)立運(yùn)用的語(yǔ)言單位。通常使用一些開(kāi)源的中文分詞工具,如jieba分詞、中科院的ictclas分詞器等。
以下是使用Python中的jieba分詞庫(kù)進(jìn)行中文分詞的示例代碼:
import jieba
text = "我愛(ài)自然語(yǔ)言處理技術(shù)"
seg_list = jieba.cut(text, cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 輸出分詞結(jié)果
輸出結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-755503.html
Default Mode: 我/ 愛(ài)/ 自然語(yǔ)言處理/ 技術(shù)
除了中文分詞外,一些專業(yè)領(lǐng)域中,還可以使用專門的領(lǐng)域詞干提取算法。例如,生物醫(yī)學(xué)領(lǐng)域中的BioStem算法可以用于提取生物詞匯的詞干。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755503.html
到了這里,關(guān)于文本預(yù)處理技巧:去除停用詞、詞形還原、詞干提取等的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!