Ⅰ tensorlab 支持python接口吗
这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护。内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。
伯乐在线已在 GitHub 上发起“Python 资源大全中文版”的整理。欢迎扩散、欢迎加入。
GitHub - jobbole/awesome-python-cn: Python资源大全中文版
环境管理
管理 Python 版本和环境的工具
p – 非常简单的交互式 python 版本管理工具。
pyenv – 简单的 Python 版本管理工具。
Vex – 可以在虚拟环境中执行命令。
virtualenv – 创建独立 Python 环境的工具。
virtualenvwrapper- virtualenv 的一组扩展。
包管理
管理包和依赖的工具。
pip – Python 包和依赖关系管理工具。
pip-tools – 保证 Python 包依赖关系更新的一组工具。
conda – 跨平台,Python 二进制包管理工具。
Curdling – 管理 Python 包的命令行工具。
wheel – Python 分发的新标准,意在取代 eggs。
包仓库
本地 PyPI 仓库服务和代理。
warehouse – 下一代 PyPI。
Warehousebandersnatch – PyPA 提供的 PyPI 镜像工具。
devpi – PyPI 服务和打包/测试/分发工具。
localshop – 本地 PyPI 服务(自定义包并且自动对 PyPI 镜像)。
分发
打包为可执行文件以便分发。
PyInstaller – 将 Python 程序转换成独立的执行文件(跨平台)。
dh-virtualenv – 构建并将 virtualenv 虚拟环境作为一个 Debian 包来发布。
Nuitka – 将脚本、模块、包编译成可执行文件或扩展模块。
py2app – 将 Python 脚本变为独立软件包(Mac OS X)。
py2exe – 将 Python 脚本变为独立软件包(Windows)。
pynsist – 一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python本身。
构建工具
将源码编译成软件。
buildout – 一个构建系统,从多个组件来创建,组装和部署应用。
BitBake – 针对嵌入式 Linux 的类似 make 的构建工具。
fabricate – 对任何语言自动找到依赖关系的构建工具。
PlatformIO – 多平台命令行构建工具。
PyBuilder – 纯 Python 实现的持续化构建工具。
SCons – 软件构建工具。
交互式解析器
交互式 Python 解析器。
IPython – 功能丰富的工具,非常有效的使用交互式 Python。
bpython- 界面丰富的 Python 解析器。
ptpython – 高级交互式Python解析器, 构建于python-prompt-toolkit 之上。
文件
文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。
imghdr – (Python 标准库)检测图片类型。
mimetypes – (Python 标准库)将文件名映射为 MIME 类型。
path.py – 对 os.path 进行封装的模块。
pathlib – (Python3.4+ 标准库)跨平台的、面向对象的路径操作库。
python-magic- 文件类型检测的第三方库 libmagic 的 Python 接口。
Unipath- 用面向对象的方式操作文件和目录
watchdog – 管理文件系统事件的 API 和 shell 工具
日期和时间
操作日期和时间的类库。
arrow- 更好的 Python 日期时间操作类库。
Chronyk – Python 3 的类库,用于解析手写格式的时间和日期。
dateutil – Python datetime 模块的扩展。
delorean- 解决 Python 中有关日期处理的棘手问题的库。
moment – 一个用来处理时间和日期的Python库。灵感来自于Moment.js。
PyTime – 一个简单易用的Python模块,用于通过字符串来操作日期/时间。
pytz – 现代以及历史版本的世界时区定义。将时区数据库引入Python。
when.py – 提供用户友好的函数来帮助用户进行常用的日期和时间操作。
文本处理
用于解析和操作文本的库。
通用
chardet – 字符编码检测器,兼容 Python2 和 Python3。
difflib – (Python 标准库)帮助我们进行差异化比较。
ftfy – 让Unicode文本更完整更连贯。
fuzzywuzzy – 模糊字符串匹配。
Levenshtein – 快速计算编辑距离以及字符串的相似度。
pangu.py – 在中日韩语字符和数字字母之间添加空格。
pyfiglet -figlet 的 Python实现。
shortuuid – 一个生成器库,用以生成简洁的,明白的,URL 安全的 UUID。
unidecode – Unicode 文本的 ASCII 转换形式 。
uniout – 打印可读的字符,而不是转义的字符串。
xpinyin – 一个用于把汉字转换为拼音的库。
Slug化
awesome-slugify – 一个 Python slug 化库,可以保持 Unicode。
python-slugify – Python slug 化库,可以把 unicode 转化为 ASCII。
unicode-slugify – 一个 slug 工具,可以生成 unicode slugs ,需要依赖 Django 。
解析器
phonenumbers – 解析,格式化,储存,验证电话号码。
PLY – lex 和 yacc 解析工具的 Python 实现。
Pygments – 通用语法高亮工具。
pyparsing – 生成通用解析器的框架。
python-nameparser – 把一个人名分解为几个独立的部分。
python-user-agents – 浏览器 user agent 解析器。
sqlparse – 一个无验证的 SQL 解析器。
特殊文本格式处理
一些用来解析和操作特殊文本格式的库。
通用
tablib – 一个用来处理中表格数据的模块。
Office
Marmir – 把输入的Python 数据结构转换为电子表单。
openpyxl – 一个用来读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件的库。
python-docx – 读取,查询以及修改 Microsoft Word 2007/2008 docx 文件。
unoconv – 在 LibreOffice/OpenOffice 支持的任意文件格式之间进行转换。
XlsxWriter – 一个用于创建 Excel .xlsx 文件的 Python 模块。
xlwings – 一个使得在 Excel 中方便调用 Python 的库(反之亦然),基于 BSD 协议。
xlwt / xlrd – 读写 Excel 文件的数据和格式信息。
relatorio – 模板化OpenDocument 文件。
PDF
PDFMiner – 一个用于从PDF文档中抽取信息的工具。
PyPDF2 – 一个可以分割,合并和转换 PDF 页面的库。
ReportLab – 快速创建富文本 PDF 文档。
Markdown
Mistune – 快速并且功能齐全的纯 Python 实现的 Markdown 解析器。
Python-Markdown – John Gruber’s Markdown 的 Python 版实现。
YAML
PyYAML – Python 版本的 YAML 解析器。
CSV
csvkit – 用于转换和操作 CSV 的工具。
Archive
unp – 一个用来方便解包归档文件的命令行工具。
自然语言处理
用来处理人类语言的库。
NLTK – 一个先进的平台,用以构建处理人类语言数据的 Python 程序。
jieba – 中文分词工具。
langid.py – 独立的语言识别系统。
Pattern – Python 网络信息挖掘模块。
SnowNLP – 一个用来处理中文文本的库。
TextBlob – 为进行普通自然语言处理任务提供一致的 API。
TextGrocery – 一简单高效的短文本分类工具,基于 LibLinear 和 Jieba。
文档
用以生成项目文档的库。
Sphinx – Python 文档生成器。
awesome-sphinxdoc
MkDocs – 对 Markdown 友好的文档生成器。
pdoc – 一个可以替换Epydoc 的库,可以自动生成 Python 库的 API 文档。
Pycco – 文学编程(literate-programming)风格的文档生成器。
配置
用来保存和解析配置的库。
config – logging 模块作者写的分级配置模块。
ConfigObj – INI 文件解析器,带验证功能。
ConfigParser – (Python 标准库) INI 文件解析器。
profig – 通过多种格式进行配置,具有数值转换功能。
python-decouple – 将设置和代码完全隔离。
命令行工具
用于创建命令行程序的库。
命令行程序开发
cement – Python 的命令行程序框架。
click – 一个通过组合的方式来创建精美命令行界面的包。
cliff – 一个用于创建命令行程序的框架,可以创建具有多层命令的命令行程序。
clint – Python 命令行程序工具。
colorama – 跨平台彩色终端文本。
docopt – Python 风格的命令行参数解析器。
Gooey – 一条命令,将命令行程序变成一个 GUI 程序。
python-prompt-toolkit – 一个用于构建强大的交互式命令行程序的库。
生产力工具
aws-cli – Amazon Web Services 的通用命令行界面。
bashplotlib – 在终端中进行基本绘图。
caniusepython3 – 判断是哪个项目妨碍你你移植到 Python 3。
cookiecutter – 从 cookiecutters(项目模板)创建项目的一个命令行工具。
Ⅱ 如何利用深度学习技术训练聊天机器人语言模型
数据预处理
模型能聊的内容也取决于选取的语料。如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练。从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介绍了,从大库中抽取小库,然后再进行融合,训练出有特色的对话来。
对于英语,需要了解NLTK,NLTK提供了加载语料,语料标准化,语料分类,PoS词性标注,语意抽取等功能。
另一个功能强大的工具库是CoreNLP,作为 Stanford开源出来的工具,特色是实体标注,语意抽取,支持多种语言。
下面主要介绍两个内容:
中文分词
现在有很多中文分词的SDK,分词的算法也比较多,也有很多文章对不同SDK的性能做比较。做中文分词的示例代码如下。
# coding:utf8
'''
Segmenter with Chinese
'''
import jieba
import langid
def segment_chinese_sentence(sentence):
'''
Return segmented sentence.
'''
seg_list = jieba.cut(sentence, cut_all=False)
seg_sentence = u" ".join(seg_list)
return seg_sentence.strip().encode('utf8')
def process_sentence(sentence):
'''
Only process Chinese Sentence.
'''
if langid.classify(sentence)[0] == 'zh':
return segment_chinese_sentence(sentence)
return sentence
if __name__ == "__main__":
print(process_sentence('飞雪连天射白鹿'))
print(process_sentence('I have a pen.'))
以上使用了langid先判断语句是否是中文,然后使用jieba进行分词。
在功能上,jieba分词支持全切分模式,精确模式和搜索引擎模式。
全切分:输出所有分词。
精确:概率上的最佳分词。
所有引擎模式:对精确切分后的长句再进行分词。
jieba分词的实现
主要是分成下面三步:
1、加载字典,在内存中建立字典空间。
字典的构造是每行一个词,空格,词频,空格,词性。
上诉书 3 n
上诉人 3 n
上诉期 3 b
上诉状 4 n
上课 650 v
建立字典空间的是使用python的dict,采用前缀数组的方式。
使用前缀数组的原因是树结构只有一层 -word:freq,效率高,节省空间。比如单词"dog", 字典中将这样存储:
{
"d": 0,
"do": 0,
"dog": 1 # value为词频
}
字典空间的主要用途是对输入句子建立有向无环图,然后根据算法进行切分。算法的取舍主要是根据模式- 全切,精确还是搜索。
2、对输入的语句分词,首先是建立一个有向无环图。
有向无环图,Directed acyclic graph(音 /ˈdæɡ/)。
【图 3-2】 DAG
DAG对于后面计算最大概率路径和使用HNN模型识别新词有直接关系。
3、按照模式,对有向无环图进行遍历,比如,在精确模式下,便利就是求最大权重和的路径,权重来自于在字典中定义的词频。对于没有出现在词典中的词,连续的单个字符也许会构成新词。然后用HMM模型和Viterbi算法识别新词。
精确模型切词:使用动态规划对最大概率路径进行求解。
最大概率路径:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。Wi为该词的词频。
更多的细节还需要读一下jieba的源码。
自定义字典
jieba分词默认的字典是:1998人民日报的切分语料还有一个msr的切分语料和一些txt小说。开发者可以自行添加字典,只要符合字典构建的格式就行。
jieba分词同时提供接口添加词汇。
Word embedding
使用机器学习训练的语言模型,网络算法是使用数字进行计算,在输入进行编码,在输出进行解码。word embedding就是编解码的手段。
【图 3-3】 word embedding, Ref. #7
word embedding是文本的数值化表示方法。表示法包括one-hot,bag of words,N-gram,分布式表示,共现矩阵等。
Word2vec
近年来,word2vec被广泛采用。Word2vec输入文章或者其他语料,输出语料中词汇建设的词向量空间。详细可参考word2vec数学原理解析。
使用word2vec
安装完成后,得到word2vec命令行工具。
word2vec -train "data/review.txt"
-output "data/review.model"
-cbow 1
-size 100
-window 8
-negative 25
-hs 0
-sample 1e-4
-threads 20
-binary 1
-iter 15
-train "data/review.txt" 表示在指定的语料库上训练模型
-cbow 1 表示用cbow模型,设成0表示用skip-gram模型
-size 100 词向量的维度为100
-window 8 训练窗口的大小为8 即考虑一个单词的前八个和后八个单词
-negative 25 -hs 0 是使用negative sample还是HS算法
-sample 1e-4 采用阈值
-threads 20 线程数
-binary 1 输出model保存成2进制
-iter 15 迭代次数
在训练完成后,就得到一个model,用该model可以查询每个词的词向量,在词和词之间求距离,将不同词放在数学公式中计算输出相关性的词。比如:
vector("法国") - vector("巴黎) + vector("英国") = vector("伦敦")"
对于训练不同的语料库,可以单独的训练词向量模型,可以利用已经训练好的模型。
其它训练词向量空间工具推荐:Glove。
Seq2Seq
2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度学习技术,基于RNN和LSTM网络训练翻译系统,取得了突破,这一方法便应用在更广泛的领域,比如问答系统,图像字幕,语音识别,撰写诗词等。Seq2Seq完成了【encoder + decoder -> target】的映射,在上面的论文中,清晰的介绍了实现方式。
【图 3-4】 Seq2Seq, Ref. #1
也有很多文章解读它的原理。在使用Seq2Seq的过程中,虽然也研究了它的结构,但我还不认为能理解和解释它。下面谈两点感受:
a. RNN保存了语言顺序的特点,这和CNN在处理带有形状的模型时如出一辙,就是数学模型的设计符合物理模型。
【图 3-5】 RNN, Ref. #6
b. LSTM Cell的复杂度对应了自然语言处理的复杂度。
【图 3-6】 LSTM, Ref. #6
理由是,有人将LSTM Cell尝试了多种其它方案传递状态,结果也很好。
【图 3-7】 GRU, Ref. #6
LSTM的一个替代方案:GRU。只要RNN的Cell足够复杂,它就能工作的很好。
使用DeepQA2训练语言模型
准备工作,下载项目:
git clone https://github.com/Samurais/DeepQA2.git
cd DeepQA2
open README.md # 根据README.md安装依赖包
DeepQA2将工作分成三个过程:
数据预处理:从语料库到数据字典。
训练模型:从数据字典到语言模型。
提供服务:从语言模型到RESt API。
预处理
DeepQA2使用Cornell Movie Dialogs Corpus作为demo语料库。
原始数据就是movie_lines.txt和movie_conversations.txt。这两个文件的组织形式参考README.txt
deepqa2/dataset/preprocesser.py是将这两个文件处理成数据字典的模块。
train_max_length_enco就是问题的长度,train_max_length_deco就是答案的长度。在语料库中,大于该长度的部分会被截断。
程序运行后,会生成dataset-cornell-20.pkl文件,它加载到python中是一个字典:
word2id存储了{word: id},其中word是一个单词,id是int数字,代表这个单词的id。
id2word存储了{id: word}。
trainingSamples存储了问答的对话对。
比如 [[[1,2,3],[4,5,6]], [[7,8,9], [10, 11, 12]]]
1,2,3 ... 12 都是word id。
[1,2,3] 和 [4,5,6] 构成一个问答。 [7,8,9] 和 [10, 11, 12] 构成一个问答。
开始训练
cp config.sample.ini config.ini # modify keys
python deepqa2/train.py
config.ini是配置文件, 根据config.sample.ini进行修改。训练的时间由epoch,learning rate, maxlength和对话对的数量而定。
deepqa2/train.py大约100行,完成数据字典加载、初始化tensorflow的session,saver,writer、初始化神经元模型、根据epoch进行迭代,保存模型到磁盘。
session是网络图,由placeholder, variable, cell, layer, output 组成。
saver是保存model的,也可以用来恢复model。model就是实例化variable的session。
writer是查看loss fn或者其他开发者感兴趣的数据的收集器。writer的结果会被saver保存,然后使用tensorboard查看。
Model
Model的构建要考虑输入,状态,softmax,输出。
定义损耗函数,使用AdamOptimizer进行迭代。
最后,参考一下训练的loop部分。
每次训练,model会被存储在save路径下,文件夹的命名根据机器的hostname,时间戳生成。
提供服务
在TensorFlow中,提供了标准的serving模块 - tensorflow serving。但研究了很久,还专门看了一遍 《C++ Essentials》,还没有将它搞定,社区也普遍抱怨tensorflow serving不好学,不好用。训练结束后,使用下面的脚本启动服务,DeepQA2的serve部分还是调用TensorFlow的python api。
cd DeepQA2/save/deeplearning.cobra.vulcan.20170127.175256/deepqa2/serve
cp db.sample.sqlite3 db.sqlite3
python manage.py runserver 0.0.0.0:8000
测试
POST /api/v1/question HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/json
Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=
Cache-Control: no-cache
{"message": "good to know"}
response
{
"rc": 0,
"msg": "hello"
}
serve的核心代码在serve/api/chatbotmanager.py中。
使用脚本
scripts/start_training.sh启动训练
scripts/start_tensorboard.sh启动Tensorboard
scripts/start_serving.sh启动服务
对模型的评价
目前代码具有很高的维护性,这也是从DeepQA项目进行重构的原因,更清晰的数据预处理、训练和服务。有新的变更可以添加到deepqa2/models中,然后在train.py和chatbotmanager.py变更一下。
有待改进的地方
a. 新建models/rnn2.py, 使用dropout。目前DeepQA中已经使用了Drop.
b. tensorflow rc0.12.x中已经提供了seq2seq network,可以更新成tf版本.
c. 融合训练,目前model只有一个库,应该是设计一个新的模型,支持一个大库和小库,不同权重进行,就如Mechanism-Aware Neural Machinefor Dialogue Response Generation的介绍。
d. 代码支持多机多GPU运行。
e. 目前训练的结果都是QA对,对于一个问题,可以有多个答案。
f. 目前没有一个方法进行accuracy测试,一个思路是在训练中就提供干扰项,因为当前只有正确的答案,如果提供错误的答案(而且越多越好),就可以使用recall_at_k方法进行测试。
机器人家上了解到的,希望对你有用
Ⅲ snownlp和nltk什么关系
没什么关系吧。 SnowNLP的开发者在GitHub描述中提到是受TextBlobd的启发才写的SnowNLP,而这两个类库的最大区别就是SnowNLP具体实现的时候没有用nltk,主要针对中文文本处理。