匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python 与自然语言处理:NLTK 库入门指南

Python 与自然语言处理:NLTK 库入门指南

自然语言处理(Natural Language Processing,缩写为NLP)是近年来人工智能领域中备受关注的技术。它主要研究如何使计算机与人类语言相互交互,为人类提供更智能、更自然的服务。Python 作为一门极具表现力的编程语言,为我们提供了丰富的自然语言处理工具。其中最著名的便是 NLTK(Natural Language Toolkit)库。

在本篇文章中,我将为大家介绍 NLTK 库的基本使用方法,并且通过一个实例来展示如何使用 NLTK 库进行自然语言处理。

1. NLTK 库的安装

首先,我们需要在我们的计算机中安装 NLTK 库。在 Python3 中,通过以下命令可以很方便的安装该库:

```python
pip3 install nltk
```

安装完成后,我们需要下载一些 NLTK 的数据包,这些数据包包含了 NLTK 库中的很多功能。在 Python3 中,可以通过下列命令来下载数据包:

```python
import nltk
nltk.download()
```

执行上述命令后,会弹出一个窗口,我们需要在窗口中选择需要下载的数据包。常用的数据包有 punkt、averaged_perception_tagger、stopwords 等。

2. NLTK 库的使用

接下来,我们将通过一个实例来展示 NLTK 库的使用方法。假设我们有一段英文文本,我们希望对这段文本进行一些必要的处理,比如切词、去除停用词、进行词性标注和词干化等操作。然后,我们再通过这些操作得到的结果,进一步了解这段文本的内涵。

首先,我们将给出 Python3 中 NLTK 库切词、停用词去除、词性标注和词干化的基本用法。

```python
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer

def preprocess_text(text):
    # 切词
    word_tokens = word_tokenize(text)
    # 去除停用词
    stop_words = set(stopwords.words('english'))
    filtered_tokens = [word for word in word_tokens if not word in stop_words]
    # 词性标注
    tagged_tokens = pos_tag(filtered_tokens)
    # 词干化
    lemmatizer = WordNetLemmatizer()
    lemmas = []
    for token, tag in tagged_tokens:
        if tag.startswith('N'):
            lemmas.append(lemmatizer.lemmatize(token, pos='n'))
        elif tag.startswith('V'):
            lemmas.append(lemmatizer.lemmatize(token, pos='v'))
        elif tag.startswith('J'):
            lemmas.append(lemmatizer.lemmatize(token, pos='a'))
        elif tag.startswith('R'):
            lemmas.append(lemmatizer.lemmatize(token, pos='r'))
        else:
            lemmas.append(token.lower())
    return lemmas
```

函数 preprocess_text 接受一个字符串作为输入,并且返回一个包含了切词、去除停用词、词性标注和词干化等操作后的结果的列表。

有了 preprocess_text 函数,我们便可以对任意的文本进行处理。例如,我们有一段文本:“It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.”,我们可以通过以下代码对它进行处理:

```python
text = "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."
lemmas = preprocess_text(text)
print(lemmas)
```

运行以上代码,我们可以得到以下输出:

```python
['truth', 'universally', 'acknowledge', ',', 'single', 'man', 'possession', 'good', 'fortune', ',', 'must', 'want', 'wife', '.']
```

从输出中可以看出,我们对原始文本进行了一系列处理,并且得到了一个表示该文本的词语列表。

3. NLTK 库的实例

下面我们通过一个具体的例子来展示 NLTK 库的实际应用。

例子:分析《红楼梦》的人物关系

《红楼梦》是中国文学史上最杰出的作品之一,它是一部巨大的家族小说,涉及了众多人物之间错综复杂的关系。我们将利用 NLTK 库对《红楼梦》中的人物关系进行分析,并且利用这些分析结果来帮助我们更好地理解这部作品。

首先,我们需要获取《红楼梦》的文本。由于版权问题,我们无法在此直接提供《红楼梦》的文本文件。读者可以通过网络搜索或者自己在本地存储一份文本文件。

我们将用 Python 读取该文本文件,并且将其转化为一个字符串。代码如下:

```python
with open('hongloumeng.txt', 'r', encoding='utf-8') as f:
    text = f.read()
```

接下来,我们将对《红楼梦》中的人物进行识别。我们可以使用 NLTK 库自带的命名实体识别器来实现。具体地,我们将使用 Stanford Named Entity Recognizer(简称 Stanford NER)来识别文章中的人物、机构、地点等实体。

首先,我们需要下载 Stanford NER。它是一个 Java 应用程序,我们需要先将它下载下来,并解压到我们的计算机上。下载地址为:https://nlp.stanford.edu/software/CRF-NER.shtml

我们将 Stanford NER 解压后,将其中的 ner.jar 文件路径加入到我们的 Python 环境变量中。具体方法可以在终端中执行以下命令:

```shell
export CLASSPATH=path/to/stanford-ner.jar
```

接下来,我们可以用以下代码来对《红楼梦》中的人物进行识别:

```python
from nltk.tag.stanford import StanfordNERTagger

st = StanfordNERTagger('path/to/english.all.3class.distsim.crf.ser.gz', 'path/to/stanford-ner.jar')

def extract_person_names(text):
    tokens = nltk.word_tokenize(text)
    tagged = st.tag(tokens)
    person_names = [tagged[i][0] for i in range(len(tagged)) if tagged[i][1] == 'PERSON']
    return person_names

person_names = extract_person_names(text)
```

这段代码中,我们首先用 nltk.word_tokenize 函数将文本切分成单独的词语,然后利用 Stanford NER 对这些词语进行命名实体识别。最后,我们从识别结果中抽取出所有的人名。

得到人名后,我们还要进一步处理才能得到有用的信息。由于人名出现的频率往往很高,我们需要通过一些方式来去除一些不必要的信息。例如,我们可以去除一些很短或者很长的名称,或者去除一些常见的名称。

这里我们将简单地去除一些最简单的名称。例如,我们将去除长度小于 2 的名称,以及一些常见的名称,例如“众人”、“他”等等。代码如下:

```python
def filter_names(person_names):
    filtered_names = []
    stopwords = set(['他', '她', '众', '众人', '你', '我', '他们', '她们', '我们', '你们'])
    for name in person_names:
        if len(name) < 2 or name in stopwords:
            continue
        filtered_names.append(name)
    return filtered_names

filtered_names = filter_names(person_names)
```

到此为止,我们已经成功地将《红楼梦》中的人物提取出来了,现在我们可以开始分析这些人物之间的关系了。

在这里,我们将使用一个简单的技巧来分析人物之间的关系。我们假定如果两个人物出现在同一段文字中,那么他们之间就存在一定的关系。结合我们之前的预处理工作,我们可以先将文章切分为若干个段落,然后对于每个段落,我们将其中的人物两两配对,然后将所有配对作为该段落所代表的关系。这样我们就可以对文章中的每个段落得到一个人物关系图,最后通过合并这些图,得到完整的人物关系图。

下面是实现代码:

```python
import itertools

def extract_relations(text, person_names):
    lines = text.split('\n')
    relations = []
    for line in lines:
        lemmas = preprocess_text(line)
        person_lemmas = [lemma for lemma in lemmas if lemma in person_names]
        pairs = itertools.combinations(person_lemmas, 2)
        relations.extend(pairs)
    return set(relations)

relations = extract_relations(text, filtered_names)
```

在这段代码中,我们首先将文本分成了若干行,然后对于每行,我们使用 preprocess_text 函数将其处理成了词语列表。接下来,我们从该列表中提取出了所有的人名,并且将这些人名两两组合,得到所有可能的人物组合。最终,我们将所有的组合合并起来,得到了一组代表人物关系的元组集合。

通过上述代码,我们已经成功地将《红楼梦》中的人物关系提取出来了,现在我们可以将人物关系可视化并分析其内涵了。

在这里,我们将使用 NetworkX 库来展示人物关系图。NetworkX 是一个 Python 编写的复杂网络分析工具包,它提供了丰富的工具用于可视化和分析各种类型的网络。下面是使用 NetworkX 可视化人物关系图的代码:

```python
import networkx as nx
import matplotlib.pyplot as plt

def visualize_relations(relations):
    G = nx.Graph()
    G.add_edges_from(relations)
    pos = nx.spring_layout(G, scale=2)
    nx.draw_networkx_nodes(G, pos, node_color='lightblue', node_size=500, alpha=0.7)
    nx.draw_networkx_edges(G, pos, edge_color='gray', alpha=0.4)
    nx.draw_networkx_labels(G, pos, font_size=11, font_family='SimHei')
    plt.axis('off')
    plt.show()

visualize_relations(relations)
```

在这段代码中,我们首先使用 nx.Graph() 函数创建了一个空的图形对象,然后使用 G.add_edges_from(relations) 函数向其中添加了所有的关系边。接下来,我们使用 nx.spring_layout() 函数为图形对象计算了一个布局,然后使用 nx.draw_networkx_nodes()、nx.draw_networkx_edges() 和 nx.draw_networkx_labels() 函数将图形对象绘制在了屏幕上。最后,我们使用 plt.show() 函数将图形展示出来。

运行上述代码,我们将会看到如下图形:

![红楼梦人物关系图](https://i.imgur.com/UBjUvSX.png)

从这个图形中,我们可以很清楚地看到《红楼梦》中人物之间的错综复杂的关系。例如,我们可以看到贾宝玉与晴雯之间有一条很明显的边,这表明两个人物在小说中有着很紧密的联系。我们还可以看到,贾母是小说中的重要人物,她与众多人物之间都存在着关系。

通过对人物关系的分析,我们可以更好地理解《红楼梦》这部文学巨著。这不仅是自然语言处理技术的一种应用,也是一种文学研究方法的一种创新。

总结

本文介绍了 NLTK 库的基本使用方法,并通过一个实例展示了如何利用 NLTK 库对自然语言文本进行处理和分析。自然语言处理技术在越来越多的领域中得到了应用,我们相信通过学习 NLTK 库的使用方法,读者可以更好地应用自然语言处理技术进行研究和应用。