手写数字识别与文本数据分析
手写数字识别
数据预处理
在处理多维数组时,需要在神经网络的起始位置使用
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)
- 单词和句子分词 :将文本分割成单个的单词或句子。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)
- 去除标点符号 :标点符号通常对文本分析没有实质性的帮助,因此需要将其去除。
import string
text = "Hello, World!"
no_punct_text = text.translate(str.maketrans('', '', string.punctuation))
print(no_punct_text)
- 去除停用词 :停用词是指在文本中频繁出现但对文本含义影响不大的词汇,如“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)
- 词干提取 :将单词还原为其词干形式,例如“running”会被提取为“run”。
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
word = "running"
stemmed_word = stemmer.stem(word)
print("词干提取结果:", stemmed_word)
- 词形还原 :与词干提取类似,但词形还原会将单词还原为其字典形式,例如“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)等,来处理更复杂的文本任务,如文本生成、机器翻译等。同时,随着数据量的不断增加,如何高效地处理和分析数据也是一个需要解决的问题。未来,我们可以继续深入学习和研究,不断探索新的技术和方法,以应对各种复杂的数据挑战。
学习建议
- 对于手写数字识别,可以多尝试不同的模型架构和参数设置,通过实验来找到最优的解决方案。
- 在文本数据分析方面,要深入理解各种预处理技术和分析方法的原理和应用场景,多实践不同的数据集,提高自己的分析能力。
- 关注行业的最新动态和研究成果,不断学习新的技术和方法,保持对数据科学领域的热情和好奇心。
超级会员免费看
1451

被折叠的 条评论
为什么被折叠?



