30、手写数字识别与文本数据分析

手写数字识别与文本数据分析

手写数字识别

数据预处理

在处理多维数组时,需要在神经网络的起始位置使用 Flatten 层,将输入数据展平为一维。同时,输入到神经网络的值是 0 到 255 之间的整数,这实际上是灰度图像,其像素值范围与 RGB 颜色类似。因此,还需要在神经网络模型中添加 Normalization 层进行归一化处理。之后,将所有数组转换为张量,以便在 TensorFlow 中使用。具体代码如下:

import tensorflow as tf
import numpy as np

# 假设 x_train, y_train, x_test, y_test, x_validation 已经定义
train_features = tf.convert_to_tensor(x_train)
train_labels = tf.convert_to_tensor(y_train)
test_features = tf.convert_to_tensor(x_test)
test_labels = tf.convert_to_tensor(y_test)
exp_features = tf.convert_to_tensor(x_validation)

使用单层感知机(SLP)进行学习和预测

模型定义

定义一个具有单个密集层的模型,该层有 10 个输出,对应 0 到 9 的十个数字,也就是手写数字要识别的十个类别。同时添加 Normalization Flatten 层。代码如下:

model = tf.keras.Sequential([
    tf.keras.layers.Normalization(),
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(10, activation='sigmoid')
])
模型编译与训练

编译模型,设置 Adam 为优化器, sparse_categorical_crossentropy 为损失函数,然后进行 20 个周期的训练。

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'])
h = model.fit(train_features, train_labels, epochs=20)
模型评估

可以通过绘制损失趋势图来查看学习阶段的情况,也可以使用 model.evaluate 函数对模型进行数值评估。

import matplotlib.pyplot as plt

# 绘制损失趋势图
acc_set = h.history['loss']
epoch_set = h.epoch
plt.plot(epoch_set, acc_set, 'o', label='Training phase')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend()
plt.show()

# 数值评估
model.evaluate(test_features, test_labels)

从评估结果来看,准确率为 0.89 并非最优,损失值下降幅度不大,稳定在 5.86 左右。

模型预测

为了查看模型对未用于学习和测试的手写数字的识别能力,使用 exp_features 数据集。扩展模型,添加 Softmax 层以得到属于各个类别的概率。

probability_model = tf.keras.Sequential([
    model,
    tf.keras.layers.Softmax()
])
predictions = probability_model.predict(exp_features)

选取第一个图像进行预测,结果显示很多数字具有相同的识别概率,预测效果不佳。再选取第 14 个容易识别的数字(数字 9)进行测试,虽然模型正确猜出了数字,但给出的概率仅约 20%,也不是一个好的预测。

使用多层感知机(MLP)进行学习和预测

模型定义

构建一个更复杂的神经网络,使用多层感知机(MLP)模型,包含一个隐藏层。第一层有 256 个神经元,隐藏层有 128 个神经元,输出层保持 10 个神经元不变。

model = tf.keras.Sequential([
    tf.keras.layers.Normalization(),
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(256, activation='sigmoid'),
    tf.keras.layers.Dense(128, activation='sigmoid'),
    tf.keras.layers.Dense(10, activation='sigmoid')
])
模型编译与训练

同样编译模型并进行 20 个周期的训练。

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
h = model.fit(train_features, train_labels, epochs=20)
模型评估

绘制损失趋势图并进行数值评估。

# 绘制损失趋势图
acc_set = h.history['loss']
epoch_set = h.epoch
plt.plot(epoch_set, acc_set, 'o', label='Training phase')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend()
plt.show()

# 数值评估
model.evaluate(test_features, test_labels)

从结果可以看出,这次学习过程更加规律,准确率较高,损失值较低。

模型预测

使用相同的两个图像进行预测,模型能够更准确地识别手写数字,表明更复杂的神经网络模型在这种情况下更有效。

手写数字识别流程总结

graph LR
    A[数据预处理] --> B[SLP模型定义]
    B --> C[SLP模型编译与训练]
    C --> D[SLP模型评估与预测]
    A --> E[MLP模型定义]
    E --> F[MLP模型编译与训练]
    F --> G[MLP模型评估与预测]

文本数据分析

文本分析技术

随着大数据的出现和互联网上大量文本数据的产生,文本分析技术变得越来越重要。以下是一些常见的文本分析技术:
| 类别 | 技术 |
| ---- | ---- |
| 预处理 | 小写转换、单词和句子分词、去除标点符号、去除停用词、词干提取、词形还原 |
| 文本分析 | 单词频率分布分析、模式识别、标记、链接和关联分析、情感分析 |

使用 NLTK 进行文本数据分析

NLTK 简介

NLTK(Natural Language Toolkit)是一个 Python 库,包含许多用于处理和分析文本数据的工具。它还包含一个大型的样本文本集合,称为语料库(corpora),可用于测试和学习。

安装 NLTK
  • 如果不使用 Anaconda 平台,可以使用 PyPI 系统安装:
pip install nltk
  • 如果使用 Anaconda 平台,可以通过 Anaconda Navigator 图形化安装,也可以使用以下命令:
conda install nltk
导入 NLTK 库和下载器工具

在 Jupyter Notebook 中,首先导入 NLTK 库,然后使用 nltk.download_shell() 打开 NLTK 下载器,通过该工具可以选择下载所需的语料库和扩展包。

import nltk
nltk.download_shell()
下载古腾堡语料库

为了创建学习示例,选择古腾堡语料库(Gutenberg corpus)。可以通过 NLTK 下载器下载,也可以直接使用 nltk.download() 函数。

nltk.download('gutenberg')

下载完成后,可以使用 fileids() 函数查看语料库中的文件列表。

gb = nltk.corpus.gutenberg
print("Gutenberg files:", gb.fileids())
访问文件内容

以莎士比亚的《麦克白》为例,使用 words() 函数提取文件中的单词,并查看文本的长度和前十个单词。

macbeth = nltk.corpus.gutenberg.words('shakespeare-macbeth.txt')
print("文本长度(单词数):", len(macbeth))
print("前十个单词:", macbeth[:10])

文本数据分析流程总结

graph LR
    A[安装 NLTK] --> B[导入 NLTK 库和下载器]
    B --> C[下载语料库]
    C --> D[访问文件内容]
    D --> E[进行文本分析]

文本数据分析深入探讨

文本预处理操作详解

在进行文本分析之前,预处理是非常关键的步骤,以下对各项预处理技术进行详细说明:
1. 小写转换 :将文本中的所有字母转换为小写,这样可以避免因大小写不同而导致的词汇重复计算。例如,“Apple”和“apple”会被视为同一个单词。

text = "Hello, World!"
lower_text = text.lower()
print(lower_text)
  1. 单词和句子分词 :将文本分割成单个的单词或句子。NLTK 提供了方便的分词工具。
from nltk.tokenize import word_tokenize, sent_tokenize

# 单词分词
word_tokens = word_tokenize("This is a sample sentence.")
print("单词分词结果:", word_tokens)

# 句子分词
sent_tokens = sent_tokenize("This is a sample sentence. Another sentence here.")
print("句子分词结果:", sent_tokens)
  1. 去除标点符号 :标点符号通常对文本分析没有实质性的帮助,因此需要将其去除。
import string

text = "Hello, World!"
no_punct_text = text.translate(str.maketrans('', '', string.punctuation))
print(no_punct_text)
  1. 去除停用词 :停用词是指在文本中频繁出现但对文本含义影响不大的词汇,如“the”、“and”、“is”等。
from nltk.corpus import stopwords

stop_words = set(stopwords.words('english'))
text = "This is a sample sentence."
filtered_text = [word for word in word_tokenize(text) if word.lower() not in stop_words]
print("去除停用词后的文本:", filtered_text)
  1. 词干提取 :将单词还原为其词干形式,例如“running”会被提取为“run”。
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
word = "running"
stemmed_word = stemmer.stem(word)
print("词干提取结果:", stemmed_word)
  1. 词形还原 :与词干提取类似,但词形还原会将单词还原为其字典形式,例如“better”会被还原为“good”。
from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
word = "better"
lemmatized_word = lemmatizer.lemmatize(word, pos='a')  # pos 表示词性
print("词形还原结果:", lemmatized_word)

文本分析技术应用示例

单词频率分布分析

通过分析单词的频率分布,可以了解文本中哪些单词出现的频率较高,从而把握文本的主题。

from nltk.probability import FreqDist

macbeth = nltk.corpus.gutenberg.words('shakespeare-macbeth.txt')
fdist = FreqDist(macbeth)
print("最常见的 10 个单词:", fdist.most_common(10))
模式识别

可以使用正则表达式来识别文本中的特定模式,例如识别日期、电话号码等。

import re

text = "My birthday is on 10/15/2023."
date_pattern = r'\d{1,2}/\d{1,2}/\d{4}'
dates = re.findall(date_pattern, text)
print("识别到的日期:", dates)
标记

标记是指为文本中的每个单词分配一个词性标签,例如名词、动词等。

from nltk import pos_tag

macbeth = nltk.corpus.gutenberg.words('shakespeare-macbeth.txt')
tagged_words = pos_tag(macbeth[:10])
print("标记结果:", tagged_words)
链接和关联分析

可以使用共现矩阵来分析单词之间的关联关系。

from nltk import bigrams
from collections import Counter

macbeth = nltk.corpus.gutenberg.words('shakespeare-macbeth.txt')
bigram_list = list(bigrams(macbeth))
bigram_counts = Counter(bigram_list)
print("最常见的 10 个二元组:", bigram_counts.most_common(10))
情感分析

情感分析可以判断文本所表达的情感是积极、消极还是中性。可以使用 NLTK 中的 VADER 工具进行情感分析。

from nltk.sentiment import SentimentIntensityAnalyzer

sia = SentimentIntensityAnalyzer()
text = "This is a great movie!"
sentiment = sia.polarity_scores(text)
print("情感分析结果:", sentiment)

文本分析综合流程

graph LR
    A[原始文本] --> B[小写转换]
    B --> C[单词和句子分词]
    C --> D[去除标点符号]
    D --> E[去除停用词]
    E --> F[词干提取/词形还原]
    F --> G[文本分析(频率分布、模式识别等)]
    G --> H[结果输出]

总结与展望

总结

通过对手写数字识别和文本数据分析的学习,我们了解到不同类型的数据需要采用不同的分析方法。在手写数字识别中,多层感知机(MLP)模型相比单层感知机(SLP)模型具有更好的识别效果,能够更快地学习并更准确地识别手写数字。在文本数据分析中,NLTK 库提供了丰富的工具和资源,帮助我们完成文本预处理和各种文本分析任务。

展望

虽然我们已经掌握了一些基本的分析方法,但在实际应用中,还需要不断优化和改进模型。例如,在手写数字识别中,可以尝试使用更复杂的卷积神经网络(CNN)来提高识别准确率;在文本数据分析中,可以结合深度学习模型,如循环神经网络(RNN)、长短期记忆网络(LSTM)等,来处理更复杂的文本任务,如文本生成、机器翻译等。同时,随着数据量的不断增加,如何高效地处理和分析数据也是一个需要解决的问题。未来,我们可以继续深入学习和研究,不断探索新的技术和方法,以应对各种复杂的数据挑战。

学习建议

  • 对于手写数字识别,可以多尝试不同的模型架构和参数设置,通过实验来找到最优的解决方案。
  • 在文本数据分析方面,要深入理解各种预处理技术和分析方法的原理和应用场景,多实践不同的数据集,提高自己的分析能力。
  • 关注行业的最新动态和研究成果,不断学习新的技术和方法,保持对数据科学领域的热情和好奇心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值