一、NLTK_介紹
????????NLTK(Natural Language Toolkit,自然語言處理工具包),一個主要用于清洗和處理英文文本的Python工具包。它有很多的功能,我們主要使用的是它的分詞功能,之前講過中文分詞是比較復雜的,但是英文分詞只需要按照空格分割就好了,英文分詞的重點是詞形還原,自定義詞組等等這些需求。英文的它會隨著單復數、時態、人稱等等發生拼寫的變化。我們在分詞的時候就要還原這個單詞的原型。
安裝:
????????pip install nltk -i https://pypi.tuna.tsinghua.edu.cn/simple?
下載語料庫
import nltk nltk.download()
下載
punkt
,averaged_perceptron_tagger
,averaged_perceptron_tagger_eng
,wordnet
,stopwords
二、分詞
# 導入NLTK的分詞工具
from nltk import word_tokenize# 待處理的英文文本
text = '''
I have my own name. They all say it's a nice name. I'd like to know what your name is.
'''# 使用word_tokenize進行分詞
tokens = word_tokenize(text)# 將所有單詞轉為小寫
res = [i.lower() for i in tokens]# 輸出結果
print(res)
['i', 'have', 'my', 'own', 'name', '.', 'they', 'all', 'say', 'it', "'s", 'a', 'nice', 'name', '.', 'i', "'d", 'like', 'to', 'know', 'what', 'your', 'name', 'is', '.']
三、詞形還原
????????NLTK可以將英文中的動詞,名詞,形容詞等詞形還原為原型
# 詞形還原
from nltk.stem import WordNetLemmatizer
# 創建詞形還原對象
wnl = WordNetLemmatizer()
# 詞形還原,需要傳入詞和詞形
print(wnl.lemmatize('better', pos='a'))
print(wnl.lemmatize('saddest', pos='a'))words = ['cars', 'men',"running","ate","saddest","fancier"]
pos_tags = ['n','n','v','v','a','a']for i in range(len(words)):print(words[i]+"--->"+ wnl.lemmatize(words[i],pos_tags[i]))
四、Text對象
????????Text是NLTK中一個非常有用的對象,它提供了一種方便的方式來處理和分析文本數據。他可以進行文本統計,詞頻可視化,文本搜索等等文本操作。
from nltk.text import Text
from nltk import word_tokenize
text='''
I have my own name. They all say it's a nice name. I'd like to know what your name is.
'''
# 分詞
tokens = nltk.word_tokenize(text)# 創建Text對象
text = nltk.Text(tokens)# 詞頻統計
print(text.count('to'))# 計算每個單詞的頻率
fdist = text.vocab()
print(fdist.most_common(10)) # 輸出前10個最頻繁的詞# 查找某個單詞的上下文
print(text.concordance('nice'))# 繪制詞頻個分布圖
text.plot(5) # 繪制前5個最頻繁的詞
1
[('name', 3), ('.', 3), ('I', 2), ('have', 1), ('my', 1), ('own', 1), ('They', 1), ('all', 1), ('say', 1), ('it', 1)]
Displaying 1 of 1 matches:
e my own name . They all say it 's a nice name . I 'd like to know what your n
五、停用詞
# 導入NLTK庫中的停用詞語料庫
from nltk.corpus import stopwords# 打印所有可用的停用詞語言列表
print(stopwords.fileids()) # 輸出例如['arabic', 'azerbaijani', 'danish'...]# 獲取英語停用詞列表
english_stopwords = stopwords.words('english') # 獲取英語停用詞列表
print(english_stopwords) # 打印輸出英語停用詞,如['i', 'me', 'my'...]'''
中文注釋說明:
1. stopwords.fileids() - 查看NLTK支持的所有停用詞語言
2. stopwords.words('language') - 獲取指定語言的停用詞列表
3. 英語停用詞包含"a", "the", "is"等常見但對語義分析無重要意義的詞匯
'''
過濾停用詞?
text = '''
I have my own name. They all say it's a nice name. I'd like to know what your name is.
'''# 使用word_tokenize對文本進行分詞
tokenize = word_tokenize(text)# 創建不重復的小寫單詞集合
tokenize_word = set({i.lower() for i in tokenize})# 過濾停用詞,只保留非停用詞
[i for i in tokenize_word if i.lower() not in english_stopwa]'''
代碼功能說明:
1. 定義了一個英文文本字符串
2. 使用word_tokenize將文本分割成單詞列表
3. 通過集合推導式生成不重復的小寫單詞集合
4. 最后使用列表推導式過濾掉停用詞,只保留有實際意義的詞匯
六、詞性標注
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tagtext = "It's a leading platform for building Python programs to work with human language data."
tokens = word_tokenize(text) # 分詞
tags = pos_tag(tokens) # 詞性標注print(tags)
POS Tag | 指代 |
---|---|
CC | 并列連詞 |
CD | 基數詞 |
DT | 限定符 |
EX | 存在詞 |
FW | 外來詞 |
IN | 介詞或從屬連詞 |
JJ | 形容詞 |
JJR | 比較級的形容詞 |
JJS | 最高級的形容詞 |
LS | 列表項標記 |
MD | 情態動詞 |
NN | 名詞單數 |
NNS | 名詞復數 |
NNP | 專有名詞 |
PDT | 前置限定詞 |
POS | 所有格結尾 |
PRP | 人稱代詞 |
PRP$ | 所有格代詞 |
RB | 副詞 |
RBR | 副詞比較級 |
RBS | 副詞最高級 |
RP | 小品詞 |
UH | 感嘆詞 |
VB | 動詞原型 |
VBD | 動詞過去式 |
VBG | 動名詞或現在分詞 |
VBN | 動詞過去分詞 |
VBP | 非第三人稱單數的現在時 |
VBZ | 第三人稱單數的現在時 |
WDT | 以wh開頭的限定詞 |
七、分塊功能
????????英文中的詞組數量非常多,很難全部表示出來,但英文的詞組構成有一定規律,比如動詞短語是動詞+名詞
,形容詞短語是形容詞+名詞
。NLTK 提供了正則表達式分塊
的方式來識別和構建自定義詞組。
????????我們可以定義的正則表達式來匹配和組合文本中的詞匯,從而創建自定義的詞組。
from nltk.tokenize import word_tokenize
from nltk import pos_tag, RegexpParser# 示例文本
text = "The quick brown fox jumped over the lazy dog."# 分詞和詞性標注
tokens = word_tokenize(text)
tagged = pos_tag(tokens)# 定義名詞短語規則
grammar = """NP: {<DT>?<JJ>*<NN>} # 名詞短語
"""# 創建語法分析器
parser = RegexpParser(grammar)
tree = parser.parse(tagged)# 打印結果
data = tree.pretty_print()# 提取并輸出詞組,查找所有名詞短語
for subtree in tree.subtrees(filter=lambda t: t.label() == 'NP'):print(' '.join([token for token, pos in subtree.leaves()]))