焦小花同学

NLTK,自然语言处理必备的工具箱!

点击

上方文字

关注我们

今天我们来聊聊一个相当厉害的 Python 库——NLTK(Natural Language Toolkit)。它是用来做自然语言处理(NLP)的神器,专门用来处理各种文本、语料库、分词、词性标注、语法解析等等。听起来好像很高大上,但别急,今天我会带你一步步了解它的强大功能。

1.

安装 NLTK

先说最重要的,NLTK 是个外部库,得先安装它才能用。命令如下:   

1pip install nltk

安装好以后,咱们就可以愉快地开始玩耍了。记得,这个库还有一些额外的数据包需要下载,别忘了这句:   

1import nltk

2nltk.download('punkt')

这个 punkt 是个分词器,后面咱们会用到。

2.

文本分词(Tokenization)

分词是 NLP 入门级的操作。简单来说就是把一段文本切分成一个个的单词或句子。NLTK 提供了非常方便的分词工具。

单词分词

我们先来看看怎么把一句话切成单词:   

1from nltk.tokenize import word_tokenize

3sentence = “我爱Python编程!”

4tokens = word_tokenize(sentence)

5print(tokens)

输出结果会是:   

1['我', '爱', 'Python', '编程', '!']

每个词,包括标点符号,都被单独分开了。是不是很简单?有了这一步,后面就可以做很多有意思的操作,比如统计词频啦、情感分析啦等等。

句子分词

除了把句子切成单词,我们还可以把一段话切成多个句子。用 sent_tokenize 来搞定:

1from nltk.tokenize import sent_tokenize

3paragraph = “我爱Python编程。它让我快乐!”

4sentences = sent_tokenize(paragraph)

5print(sentences)

结果是:   

1['我爱Python编程。', '它让我快乐!']

它能智能地识别句号、感叹号,把文本分成一段段的句子。

3.

词性标注(Part-of-Speech Tagging)

分完词后,通常下一步就是给每个词打上标签,告诉我们这个词的词性是什么,是名词、动词还是形容词?NLTK 也提供了词性标注的功能。   

1from nltk import pos_tag

2from nltk.tokenize import word_tokenize

4sentence = “I love programming.”

5tokens = word_tokenize(sentence)

6tagged = pos_tag(tokens)

7print(tagged)

输出结果可能是这样:   

1[('I', 'PRP'), ('love', 'VBP'), ('programming', 'NN'), ('.', '.')]

每个词后面的字符串代表它的词性,比如 PRP 是代词,VBP 是动词,NN是名词。如果你觉得这些缩写看不懂,没关系,刚开始大家都是懵的。慢慢多用几次,熟悉了就好。

4.

词干提取(Stemming)

有时候我们处理文本时,可能会遇到同一个单词的不同形式,比如 “running” 和 “ran”。为了让这些词统一起来,NLTK 提供了词干提取的功能(Stemming),让这些不同形式的词还原成它们的“词干”。   

1from nltk.stem import PorterStemmer

3stemmer = PorterStemmer()

4words = [“running”, “runs”, “ran”]

5stems = [stemmer.stem(word) for word in words]

6print(stems)

输出结果是:   

1['run', 'run', 'ran']

你会发现 “running” 和 “runs” 都被还原成了 “run”。这种操作可以帮助我们在后续的文本分析中更好地处理数据,减少噪声。

5.

词形还原(Lemmatization)

与词干提取类似,但更智能的一种是词形还原(Lemmatization)。它不仅仅是简单粗暴地截断词尾,而是通过查词典的方式把单词还原到它的基本形式。   

1from nltk.stem import WordNetLemmatizer

3lemmatizer = WordNetLemmatizer()

4lemmas = [lemmatizer.lemmatize(word, pos='v') for word in words]

5print(lemmas)

输出是:   

1['run', 'run', 'run']

和 Stemming 不一样,Lemmatization 把 “ran” 也还原成了 “run”。这一点在某些应用场景下可能会更精准。

6.

停用词(Stop Words)

处理文本时,我们经常会遇到一些无意义的词,比如 “的”,“是”,“and”,“the” 这样频繁出现的词。我们通常会把这些词过滤掉,NLTK 提供了一个现成的停用词表,直接调用就行。   

1from nltk.corpus import stopwords

3stop_words = set(stopwords.words('english'))

4words = [“This”, “is”, “a”, “simple”, “example”]

5filtered_words = [word for word in words if word.lower() not in stop_words]

6print(filtered_words)

输出:   

1['This', 'simple', 'example']

“is” 和 “a” 这些常见的停用词就被过滤掉了。停用词库不仅仅是英文,NLTK 还提供了很多其他语言的停用词表。

7.

文本语料库(Corpora)

NLTK 内置了很多现成的语料库(Corpora),这些语料库可以用来做各种实验和分析。比如,常见的布朗语料库、古腾堡项目等等。   

1from nltk.corpus import gutenberg

3sample_text = gutenberg.raw('austen-emma.txt')

4print(sample_text[:500])

这段代码会输出《爱玛》这本书的前 500 个字符。语料库非常丰富,你可以随便调来试试。

8.

温馨提示

写到这儿,我得提醒你一下,NLTK 虽然功能强大,但处理大规模文本时可能会有点慢。如果你想处理超大规模的文本数据,你可能需要考虑一些更高效的库,比如spaCy 或者 transformers。但对于入门和轻量级应用来说,NLTK 绝对是个不错的选择。

别忘了点

Image

分享、

Image

收藏、

Image

在看、

Image

点赞

哦!