Python----NLP自然语言处理(英文分词器--NLTK)

一、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_tag

text = "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()]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值