Python 物联网入门指南(一)(3)https://developer.aliyun.com/article/1506427
使用 SMB 共享树莓派的主文件夹
当您将树莓派连接到网络时,您可以通过设置文件共享来访问主文件夹;这样可以更轻松地传输文件,并提供了一种快速简便的备份数据的方法。服务器消息块(SMB)是一种与 Windows 文件共享、OS X 和 Linux 兼容的协议。
准备工作
确保您的树莓派已接通电源并连接到互联网。
您还需要另一台在同一本地网络上的计算机来测试新的共享。
如何做…
首先,我们需要安装samba
,这是一款处理与 Windows 共享方法兼容的文件夹共享的软件:
- 确保您使用以下命令来获取可用软件包的最新列表:
sudo apt-get update sudo apt-get install samba
安装将需要大约 20MB 的空间,并需要几分钟的时间。
- 安装完成后,我们可以按照以下方式复制配置文件,以便在需要时恢复默认设置:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup sudo nano /etc/samba/smb.conf
向下滚动并找到名为Authentication
的部分;将# security = user
行更改为security = user
。
如文件中所述,此设置确保您必须输入用户名和密码才能访问树莓派的文件(这对于共享网络非常重要)。
找到名为Share Definitions
和[homes]
的部分,并将read only = yes
行更改为read only = no
。
这将允许我们查看并向共享的主文件夹写入文件。完成后,按Ctrl + X,Y和Enter保存并退出。
如果您已将默认用户从pi
更改为其他内容,请在以下说明中进行替换。
- 现在,我们可以添加
pi
(默认用户)来使用samba
:
sudo pdbedit -a -u pi
- 现在,输入密码(您可以使用与登录相同的密码或选择不同的密码,但避免使用默认的树莓密码,这对某人来说将非常容易猜到)。重新启动
samba
以使用新的配置文件,如下所示:
sudo /etc/init.d/samba restart [ ok ] Stopping Samba daemons: nmbd smbd. [ ok ] Starting Samba daemons: nmbd smbd.
- 要进行测试,您需要知道树莓派的
hostname
(默认hostname
为raspberrypi
)或其 IP 地址。您可以使用以下命令找到这两者。
hostname
- 对于 IP 地址,添加
-I
:
hostname -I
在网络上的另一台计算机上,在资源管理器路径中输入\raspberrypipi
地址。
根据您的网络,计算机应该能够在网络上找到树莓派,并提示输入用户名和密码。如果它无法使用hostname
找到共享,您可以直接使用 IP 地址,其中192.168.1.69
应更改为匹配 IP 地址\192.168.1.69pi
。
保持树莓派最新
树莓派使用的 Linux 镜像经常更新,以包括对系统的增强、修复和改进,以及对新硬件的支持或对最新板的更改。您安装的许多软件包也可以进行更新。
如果您打算在另一个树莓派板上使用相同的系统镜像(特别是较新的板),这一点尤为重要,因为旧镜像将缺乏对任何布线更改或替代 RAM 芯片的支持。新固件应该可以在较旧的树莓派板上工作,但是旧固件可能与最新的硬件不兼容。
幸运的是,每次有新版本发布时,您无需重新刷写 SD 卡,因为可以进行更新。
准备就绪
您需要连接到互联网才能更新系统。始终建议首先备份您的镜像(至少复制您的重要文件)。
您可以使用uname -a
命令检查当前固件的版本,如下所示:
Linux raspberrypi 4.4.9-v7+ #884 SMP Fri May 6 17:28:59 BST 2016 armv7l GNU/Linux
可以使用/opt/vc/bin/vcgencmd version
命令来检查 GPU 固件,如下所示:
May 6 2016 13:53:23 Copyright (c) 2012 Broadcom version 0cc642d53eab041e67c8c373d989fef5847448f8 (clean) (release)
如果您在较新的板上使用较旧的固件(2012 年 11 月之前),这一点很重要,因为最初的 B 型板只有 254MB RAM。升级可以使固件利用额外的内存(如果可用)。
free -h
命令将详细说明主处理器可用的 RAM(总 RAM 在 GPU 和 ARM 核心之间分配),并将给出以下输出:
total used free shared buffers cached Mem: 925M 224M 701M 7.1M 14M 123M -/+ buffers/cache: 86M 839M Swap: 99M 0B 99M
然后可以在重新启动后重新检查前面的输出,以确认它们已经更新(尽管它们可能已经是最新的)。
如何做…
- 在运行任何升级或安装任何软件包之前,值得确保您拥有存储库中最新的软件包列表。
update
命令获取可用软件和版本的最新列表:
sudo apt-get update
- 如果您只想获取当前软件包的升级,
upgrade
将使它们全部保持最新状态:
sudo apt-get upgrade
- 为确保您运行的是最新版本的 Raspbian,可以运行
dist-upgrade
(请注意:这可能需要一小时或更长时间,具体取决于需要升级的数量)。这将执行upgrade
将执行的所有更新,但还将删除多余的软件包并进行清理:
sudo apt-get dist-upgrade
这两种方法都将升级软件,包括在启动和启动时使用的固件(bootcode.bin
和start.elf
)。
- 要更新固件,可以使用以下命令:
sudo rpi-update
还有更多…
您经常会发现您想要对设置进行干净的安装,但是这意味着您将不得不从头开始安装所有内容。为了避免这种情况,我开发了 Pi-Kitchen 项目(github.com/PiHw/Pi-Kitchen
),基于Kevin Hill的基础工作。这旨在提供一个灵活的平台,用于创建可以自动部署到 SD 卡的定制设置:
Pi Kitchen 允许在启动之前配置树莓派
Pi-Kitchen 允许配置各种口味,可以从 NOOBS 菜单中选择。每种口味都包括一系列食谱,每个食谱都提供最终操作系统的特定功能或特性。食谱可以从为 Wi-Fi 设备设置自定义驱动程序,到在您的网络上映射共享驱动器,再到提供一个功能齐全的网络服务器,所有这些都组合在一起,以满足您的要求。
该项目处于测试阶段,作为概念验证开发,但是一旦您配置好一切,将完全工作的设置直接部署到 SD 卡上将非常有用。最终,该项目可以与 Kevin Hill 的 NOOBS 的高级版本PINN Is Not NOOBS(PINN)结合使用,旨在为高级用户提供额外功能,例如允许操作系统和配置存储在您的网络上或外部 USB 存储器上。
第二章:划分文本数据和构建文本分类器
本章介绍了以下主题:
- 构建文本分类器
- 使用标记化预处理数据
- 词干化文本数据
- 使用分块划分文本
- 构建词袋模型
- 文本分类器的应用
介绍
本章介绍了构建文本分类器的方法。这包括从数据库中提取重要特征、训练、测试和验证文本分类器。最初,使用常用词训练文本分类器。后来,训练好的文本分类器用于预测。构建文本分类器包括使用标记化预处理数据、词干化文本数据、使用分块划分文本和构建词袋模型。
构建文本分类器
分类器单元通常被认为是将数据库分成各种类别的。朴素贝叶斯分类器方案被广泛认为是根据训练模型将文本分隔的文献。本章的这一部分最初考虑了一个带有关键词的文本数据库;特征提取从文本中提取关键短语并训练分类器系统。然后,实施词频-逆文档频率(tf-idf)转换以指定单词的重要性。最后,使用分类器系统预测并打印输出。
如何做…
- 在新的 Python 文件中包含以下行以添加数据集:
from sklearn.datasets import fetch_20newsgroups category_mapping = {'misc.forsale': 'Sellings', 'rec.motorcycles': 'Motorbikes', 'rec.sport.baseball': 'Baseball', 'sci.crypt': 'Cryptography', 'sci.space': 'OuterSpace'} training_content = fetch_20newsgroups(subset='train', categories=category_mapping.keys(), shuffle=True, random_state=7)
- 执行特征提取以从文本中提取主要单词:
from sklearn.feature_extraction.text import CountVectorizer vectorizing = CountVectorizer() train_counts = vectorizing.fit_transform(training_content.data) print "nDimensions of training data:", train_counts.shape
- 训练分类器:
from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import TfidfTransformer input_content = [ "The curveballs of right handed pitchers tend to curve to the left", "Caesar cipher is an ancient form of encryption", "This two-wheeler is really good on slippery roads" ] tfidf_transformer = TfidfTransformer() train_tfidf = tfidf_transformer.fit_transform(train_counts)
- 实现多项式朴素贝叶斯分类器:
classifier = MultinomialNB().fit(train_tfidf, training_content.target) input_counts = vectorizing.transform(input_content) input_tfidf = tfidf_transformer.transform(input_counts)
- 预测输出类别:
categories_prediction = classifier.predict(input_tfidf)
- 打印输出:
for sentence, category in zip(input_content, categories_prediction): print 'nInput:', sentence, 'nPredicted category:', category_mapping[training_content.target_names[category]]
以下屏幕截图提供了根据数据库输入预测对象的示例:
它是如何工作的…
本章的前一部分提供了有关实施分类器部分和一些样本结果的见解。分类器部分是基于训练好的朴素贝叶斯中的先前文本与测试序列中的关键测试之间的比较工作的。
另请参阅
请参阅以下文章:
- 情感分析算法和应用:调查在
www.sciencedirect.com/science/article/pii/S2090447914000550
。 - 在线评论的情感分类:使用基于句子的语言模型来学习情感预测的工作方式
www.tandfonline.com/doi/abs/10.1080/0952813X.2013.782352?src=recsys&journalCode=teta20
。 - 使用产品评论数据进行情感分析和在存在情感的情况下进行句子级情感分析,以了解推荐系统中使用的各种指标
journalofbigdata.springeropen.com/articles/10.1186/s40537-015-0015-2
和link.springer.com/chapter/10.1007/978-3-642-54903-8_1
。
使用标记化预处理数据
数据的预处理涉及将现有文本转换为学习算法的可接受信息。
标记化是将文本分成一组有意义的片段的过程。这些片段被称为标记。
如何做…
- 介绍句子标记化:
from nltk.tokenize import sent_tokenize
- 形成一个新的文本标记器:
tokenize_list_sent = sent_tokenize(text) print "nSentence tokenizer:" print tokenize_list_sent
- 形成一个新的单词标记器:
from nltk.tokenize import word_tokenize print "nWord tokenizer:" print word_tokenize(text)
- 引入一个新的 WordPunct 标记器:
from nltk.tokenize import WordPunctTokenizer word_punct_tokenizer = WordPunctTokenizer() print "nWord punct tokenizer:" print word_punct_tokenizer.tokenize(text)
标记器得到的结果如下所示。它将一个句子分成单词组:
词干化文本数据
词干处理过程涉及为标记器的单词创建适当的缩写单词。
如何做…
- 使用新的 Python 文件初始化词干处理过程:
from nltk.stem.porter import PorterStemmer from nltk.stem.lancaster import LancasterStemmer from nltk.stem.snowball import SnowballStemmer
- 让我们描述一些要考虑的词,如下所示:
words = ['ability', 'baby', 'college', 'playing', 'is', 'dream', 'election', 'beaches', 'image', 'group', 'happy']
- 确定要使用的一组
词干处理器
:
stemmers = ['PORTER', 'LANCASTER', 'SNOWBALL']
- 为所选的“词干处理器”初始化必要的任务:
stem_porter = PorterStemmer() stem_lancaster = LancasterStemmer() stem_snowball = SnowballStemmer('english')
- 格式化表格以打印结果:
formatted_row = '{:>16}' * (len(stemmers) + 1) print 'n', formatted_row.format('WORD', *stemmers), 'n'
- 反复检查单词列表,并使用选择的“词干处理器”对它们进行排列:
for word in words: stem_words = [stem_porter.stem(word), stem_lancaster.stem(word), stem_snowball.stem(word)] print formatted_row.format(word, *stem_words)
词干处理过程得到的结果如下截图所示:
使用分块分割文本
分块过程可用于将大文本分成小的、有意义的单词。
如何做…
- 使用 Python 开发并导入以下包:
import numpy as np from nltk.corpus import brown
- 描述将文本分成块的函数:
# Split a text into chunks def splitter(content, num_of_words): words = content.split(' ') result = []
- 初始化以下编程行以获取分配的变量:
current_count = 0 current_words = []
- 开始使用单词进行迭代:
for word in words: current_words.append(word) current_count += 1
- 获取必要数量的单词后,重新组织变量:
if current_count == num_of_words: result.append(' '.join(current_words)) current_words = [] current_count = 0
- 将块附加到输出变量:
result.append(' '.join(current_words)) return result
- 导入“布朗语料库”的数据,并考虑前 10000 个单词:
if __name__=='__main__': # Read the data from the Brown corpus content = ' '.join(brown.words()[:10000])
- 描述每个块中的字大小:
# Number of words in each chunk num_of_words = 1600
- 初始化一对重要的变量:
chunks = [] counter = 0
- 通过调用“分割器”函数打印结果:
num_text_chunks = splitter(content, num_of_words) print "Number of text chunks =", len(num_text_chunks)
- 分块后得到的结果如下截图所示:
构建词袋模型
在处理包含大单词的文本文档时,我们需要将它们转换为几种类型的算术表示。我们需要将它们制定为适合机器学习算法的形式。这些算法需要算术信息,以便它们可以检查数据并提供重要的细节。词袋程序帮助我们实现这一点。词袋创建一个文本模型,使用文档中的所有单词来发现词汇。随后,它通过构建文本中所有单词的直方图来为每个文本创建模型。
如何做…
- 通过导入以下文件初始化一个新的 Python 文件:
import numpy as np from nltk.corpus import brown from chunking import splitter
- 定义
main
函数并从“布朗语料库”中读取输入数据:
if __name__=='__main__': content = ' '.join(brown.words()[:10000])
- 将文本内容分成块:
num_of_words = 2000 num_chunks = [] count = 0 texts_chunk = splitter(content, num_of_words)
- 基于这些“文本”块构建词汇表:
for text in texts_chunk: num_chunk = {'index': count, 'text': text} num_chunks.append(num_chunk) count += 1
- 提取文档词矩阵,有效地计算文档中每个单词的出现次数:
from sklearn.feature_extraction.text import CountVectorizer
- 提取文档术语“矩阵”:
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer(min_df=5, max_df=.95) matrix = vectorizer.fit_transform([num_chunk['text'] for num_chunk in num_chunks])
- 提取词汇并打印它:
vocabulary = np.array(vectorizer.get_feature_names()) print "nVocabulary:" print vocabulary
- 打印文档术语“矩阵”:
print "nDocument term matrix:" chunks_name = ['Chunk-0', 'Chunk-1', 'Chunk-2', 'Chunk-3', 'Chunk-4'] formatted_row = '{:>12}' * (len(chunks_name) + 1) print 'n', formatted_row.format('Word', *chunks_name), 'n'
- 迭代单词,并打印每个单词在不同块中的重现:
for word, item in zip(vocabulary, matrix.T): # 'item' is a 'csr_matrix' data structure result = [str(x) for x in item.data] print formatted_row.format(word, *result)
- 执行词袋模型后获得的结果如下所示:
为了理解它在给定句子上的工作原理,请参考以下内容:
文本分类器的应用
文本分类器用于分析客户情绪,在产品评论中,当在互联网上搜索查询时,在社交标签中,预测研究文章的新颖性等等。