tfidfpython
⑴ 用python采用TF IDF实现从多个文本文档中选出特征词应该怎样实现
如果最终就是文本分类的话,对所有词汇得到TF-IDF后,再建立各文本对词汇表的特征向量,用余弦定理判断相似度,然后做一下聚类,从而实现文本分类。
应该从工程角度效果应该不错,吴军博士《数学之美》第14章讲到过,里面把原理也解释了,很符合直觉,虽然没有用到太高深的理论。
⑵ 如何用Python玩转TF-IDF之寻找相似文章并生成摘要
应用1:关键词自动生成
核心思想是对于某个文档中的某个词,计算其在这个文档中的标准化TF值,然后计算这个词在整个语料库中的标准化IDF值。在这里,标准化是说对原始的计算公式进行了一些变换以取得更好的衡量效果,并避免某些极端情况的出现。这个词的TF-IDF值便等于TF*IDF。对于这个文档中的所有词计算它们的TF-IDF值,并按照由高到低的顺序进行排序,由此我们便可以提取我们想要的数量的关键词。
TF-IDF的优点是快捷迅速,结果相对来说比较符合实际情况。缺点是当一篇文档中的两个词的IDF值相同的时候,出现次数少的那个词有可能更为重要。再者,TF-IDF算法无法体现我词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。存在的解决办法是对文章的第一段和每段的第一句话给予比较大的权重。
应用2:计算文本相似度
明白了对于每个词,如何计算它的TF-IDF值。那么计算文本相似度也轻而易举。我们已经计算了文章中每个词的TF-IDF值,那么我们便可以将文章表征为词的TF-IDF数值向量。要计算两个文本的相似度,只需要计算余弦即可,余弦值越大,两个文本便越相似。
应用3:自动摘要
2007年,美国学者的论文<A Survey on Automatic Text Summarization>总结了目前的自动摘要算法,其中很重要的一种就是词频统计。这种方法最早出自1958年IBM公司一位科学家的论文<The Automatic Creation of Literature Abstracts>。这位科学家认为,文章的信息都包含在句子中,有的句子包含的信息多,有的句子包含的信息少。自动摘要就是找出那些包含信息最多的句子。那么句子的信息量怎么衡量呢?论文中采用了关键词来衡量。如果包含的关键词越多,就说明这个句子越重要,这位科学家提出用Cluster的来表示关键词的聚集。所谓簇,就是包含多个关键词的句子片段。
以第一个图为例,其中的cluster一共有7个词,其中4个是关键词。因此它的重要性分值就等于(4*4)/7=2.3。然后,找出包含cluster重要性分值最高的句子(比如5句),把它们合在一起,就构成了这篇文章的自动摘要。具体实现可以参见<Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites>(O'Reilly, 2011)一书的第8章,Python代码见github。这种算法后来被简化,不再区分cluster,只考虑句子包含的关键词。伪代码如下。
Summarizer(originalText,maxSummarySize):
//计算文本的词频,生成一个列表,比如[(10,'the'),(3,'language'),(8,'code')...]
wordFrequences=getWordCounts(originalText)
//过滤掉停用词,列表变成[(3,'language'),(8,'code')...]
contentWordFrequences=filtStopWords(wordFrequences)
//按照词频的大小进行排序,形成的列表为['code','language'...]
contentWordsSortbyFreq=sortByFreqThenDropFreq(contentWordFrequences)
//将文章分成句子
sentences=getSentences(originalText)
//选择关键词首先出现的句子
setSummarySentences={}
:
firstMatchingSentence=search(sentences,word)
setSummarySentences.add(firstMatchingSentence)
ifsetSummarySentences.size()=maxSummarySize:
break
//将选中的句子按照出现顺序,组成摘要
summary=""
foreachsentenceinsentences:
:
summary=summary+""+sentence
returnsummary
类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4J的C#实现和python实现。
⑶ 能够用于tf-idf的语料库(python学习).
您好,推荐使用CRAFT语料库
CRAFT(Colorado Richly Annotated Full-Text)语料库,中文名科罗拉多丰富语料注释库。CRAFT收录了97篇可公开获取全文的生物医学期刊文献,并将这些文章在语义和句法上都作了详尽的注释以作为自然语言处理(NLP)社区的生物医学研究资源。CRAFT基于9个常用的生物医学本体,从这97篇文献中识别了所有的生物学实体,这些本体包括:细胞类型本体,小分子化合物本体(CHEBI),NCBI分类法,蛋白质本体,序列本体,Entrez Gene数据库的条目,以及基因本体(Gene Ontology)的三个子条目。CRAFT语料库已被广泛应用于对文本挖掘工具的性能测试中。当然也可以用于TF-IDF方法。
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
⑷ 关键词提取算不算自然语言处理的任务
算
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1.TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
⾸先解释⼀下TF-IDF的意思:
TF(term frequency):词语在⼀篇⽂章中出现的频率
IDF(inverse document frequency):反⽂档频率,与词语在其他⽂档中出现的频率负相关
TF-IDF的主要思想是:如果某个词或短语在⼀篇⽂章中出现的频率⾼,即TF值⾼;并且在其他⽂章中很少出现,即IDF值⾼,那么认为这个词或短语具有很好的类别区分能⼒,适合作为该⽂章的关键词。
TF-IDF的具体计算公式为:
⽂档中词的tfidf值越⾼,便认为该词越可以代表该⽂档的主题。TF-IDF算法的python实现如下,同时jieba库中也实现了TF-IDF,有兴趣的话也可以去了解⼀下。
# TF-IDf算法python实现
import re
import math
# 获取⼀个⽂档中每个词的TF值,doc参数保存⽂档中的句⼦列表,返回单词与其tf值的字典
# ⾸先对⽂档中的单词进⾏切分,然后统计每个词的词频
def GetWordTF(doc):
words_count =0# 单词总数
words_map ={}# 单词与单词数的映射
tf_map ={}# tf值映射词典,格式: tf_map[word] = tf_word
for sentence in doc:# 遍历⽂档中的每个句⼦
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in re.split(r'\W+',sentence)if word]
words_count +=len(words_arr)# 统计有效词的总长度
for word in words_arr:# 遍历每⼀个词并进⾏统计单词数
words_map[word]= words_map.get(word,0)+1
for key,val in words_map.items():# 计算每个单词的tf值
tf_map[key]= val / words_count
return tf_map
# 获取⽂档每个单词在⽂档集docSet中的IDF值映射
def GetWordIDF(tfMap,docSet):
docs_num =len(docSet)# ⽂档集中⽂档的总数
word_doc_num ={}# 包含word的⽂档数,格式为word_doc_num[word] = num of doc that contains word
idf_map ={}# idf值映射字典,格式idf_map[word] = idf_word
for key,val in tfMap.items():# 遍历⽂档中出现的单词
for doc in docSet:# 遍历每个⽂档,检查该⽂档中是否出现了单词key
for sentence in doc:# 遍历⽂档中的每个句⼦
words_arr =[word for word in re.split(r'\W+', sentence)if word]# 提取句⼦中的每个单词
if key in words_arr:# 如果该⽂档中有该词,则统计
word_doc_num[key]= word_doc_num.get(key,0)+1
break
for key,val in word_doc_num.items():# 计算每个单词的idf值
idf_map[key]= math.log(docs_num / val)
return idf_map
# 使⽤TFIDF算法获取⽂档的前topNum个关键词,其中每个⽂档是以列表表⽰的,列表项为⽂档的⼀个句⼦
def GetKeywordsByTFIDF(entityDescriptionList,docSet,topNum):
tf_map = GetWordTF(entityDescriptionList)# 获取每个单词的tf值
idf_map = GetWordIDF(tf_map,docSet)# 获取每个单词的idf值
tfidf_map ={}
for key,val in tf_map.items():# 计算每个词的tfidf值
tfidf_map[key]= tf_map[key]* idf_map[key]
tfidf_sorted_list =sorted(tfidf_map.items(),key =lambda x:x[1],reverse=True)# 将字典按值从⼤到⼩排序
if topNum >len(tfidf_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(tfidf_sorted_list)
keywords =[]# 保存⽂档的前topNum个关键字
for i in range(topNum):
keywords.append(tfidf_sorted_list[i][0])# 关键字保存在元组的第0个元素中
return keywords
2.TextRank
TF-IDF算法对于有多段⽂本的关键词提取⾮常有效,但是对于单篇或⽂档集较少的⽂本则表现得不很好。对于单篇⽂档,可以使⽤TextRank算法实现关键词提取。
TextRank是⼀种基于图排序的算法,思想源于⾕歌的PageRank算法,通过把⽂本分割为若⼲组成单元(单词、句⼦)并建⽴图模型,利⽤投票机制对⽂本中的重要成分进⾏排序,仅利⽤单篇⽂档本⾝的信息即可实现关键词提取。
TextRank利⽤投票的原理,让每⼀个单词给它的邻居投赞成票,票的权重取决于⾃⼰的票数。假设每⼀个词是⼀个顶点(Vertex),那么所有的词就构成了⼀个⽹络,这个⽹络⾥⾯每个顶点会有指向其他顶点的边,也会有其他顶点指向⾃⼰的边。通过计算每个顶点所连接的指向⾃⼰的顶点的权重和,最终得到该顶点的权重值。
TextRank存在的主要问题是初始值的确定,为了后续计算的简便性,这⾥会给初值赋为⼀个⾮0值。同时,引⼊了⼀个阻尼系数的概念,该参数表⽰从某⼀个指定的顶点,到任意⼀个其他顶点的概率。TextRank的具体公式如下:
于是,使⽤TextRank算法提取关键词时,⾸先需要把图构建出来。图的节点就是单词,⾄于边可以利⽤n-gram的思路,认为某个单词只与它附近的n个单词有关,即与它附近的n个词对应的节点连⼀条⽆向边。也可以做⼀些其他操作,⽐如把某类词性的词删掉,⼀些⾃定义词删掉,只保留⼀部分单词等。我的代码实现中,假设每个长为k的滑动窗⼝中的任意两个单词对应的节点之间存在⼀条⽆向⽆权边。当构图成功后,就可以使⽤上述公式进⾏迭代求解了。Python实现的代码如下:
# 使⽤TextRank算法实现关键词提取,返回关键词列表,参数含义如下:
# sentence 保存待提取关键字的句⼦
# windowLength 保存滑动窗⼝的⼤⼩
# topNum 表⽰需要返回排名前topNum的关键词
# d 表⽰textrank算法的阻尼系数,默认为0.85
# maxIter 表⽰算法最⼤迭代次数
# minDiff 迭代后变化值⼩于minDiff时也停⽌迭代
def GetKeywordsByTextRank(sentence,windowLength,topNum=3,d=0.85,maxIter=10000,minDiff=0.0001):
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in re.split(r'\W+', sentence)if word]
words_num =len(words_arr)# 句⼦的长度
word_graph ={}# 保存每个单词的连接状态,格式为word_graph[word] = [与该词存在边的单词的集合]
textrank_map ={}# 保存每个textrank值的字典,格式为textrank_map[word] = textrank value of the word
textrank_map_t ={}# ⽤于保存前⼀次迭代的tankrank结果
for words_index in range(words_num):# 遍历句⼦中的每个单词,开始根据给定的窗⼝值构图
textrank_map[words_arr[words_index]]=1- d # 为每个词初始化⼀个textrank值
window_lower =max(0, words_index - windowLength)# 滑动窗⼝的下边界
window_upper =min(words_num, words_index + windowLength)# 滑动窗⼝的上边界
for window_index in range(window_lower,window_upper):# 遍历窗⼝中的单词,构建单词的连接关系
if window_index == words_index:# ⾃⼰与⾃⼰认为没有边
continue
if not words_arr[window_index]in word_graph.get(words_arr[words_index],[]):# 检查两词节点之间是否有边
if word_graph.get(words_arr[words_index],0)==0:# 检查该词的边集是否为空
word_graph[words_arr[words_index]]=[words_arr[window_index]]# 为空则⽣成包含该点的边集
else:
word_graph[words_arr[words_index]].append(words_arr[window_index])# 将该边添加到边集中
for iter_i in range(maxIter):# 利⽤textrank计算公式迭代计算
max_diff =0# 表⽰迭代前后两次的变化
for word,neibor_list in word_graph.items():# 遍历每个单词
for con_word in neibor_list:# 遍历与每个单词存在相邻关系的单词
con_word_out_len =len(word_graph[con_word])# 计算当前节点连接的节点个数
if word == con_word or con_word_out_len ==0:
continue# 如果是该节点本⾝或⽆连出节点则不更新
# 使⽤公式对textrank值进⾏更新
textrank_map[word]=1- d + d * textrank_map_t.get(con_word,0)/con_word_out_len
max_diff =max(max_diff,abs(textrank_map[word]-textrank_map_t.get(word,0)))
for word,val in textrank_map.items():
textrank_map_t[word]= val
if(max_diff < minDiff):# 各个单词节点的textrank值如果均⽆明显变化,则可结束迭代
break
textrank_sorted_list =sorted(textrank_map.items(),key=lambda x:x[1],reverse=True)# 按照textrank值从⼤到⼩排序
if topNum >len(textrank_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(textrank_sorted_list)
if topNum <1:# 保证topNum⼤于0
topNum =1
keywords =[]# 保存将要返回的关键词
for i in range(topNum):
keywords.append(textrank_sorted_list[i][0])
return keywords
可以看出TextRank算法对于⼀段⽂本中多次出现的词,会赋予更⼤的权重,因为它连出的节点更多,所以当各个节点初始权重⼀致时,则最终出现次数最多的词权重就会更⼤。这也会使该算法对类似于“的”、“你、我、他”等常⽤词,会出现⽐较⼤的误差。对于这种情况,可以在最开始构建边时进⾏处理,去掉⼀些停⽤词或者选择⾃⼰需要的词性的词,从⽽得出实际有⽤的词语。
后记:前端暂时不⽀持Latex,公式我只能贴图了。深度学习最近⽐较流⾏,还有很多需要学的呀!
网络文库VIP已帮您省69元现在恢复最低仅需0.3元/天
立即续费
自然语言处理(一)--关键词提取
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1.TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
⑸ 用python采用TF IDF实现从多个文本文档中选出特征词应该怎样实现
最简单的就是自己分词,统计词频,获取公式需要的相关数据,计算tfidf之后,判断文档下相关度最高的词就行了
⑹ 请教一下Python中models.TfidfModel的用法
中括号可以表示取字典的某个键对应的值,也可以表示列表的某个元素
你这代码应该是人工智能相关的吧,这里重点并不是python,而是相关数学知识
⑺ python怎样对tfidf计算出来的权值进行排序'
1.使用python+selenium分析dom结构爬取网络|互动网络文本摘要信息;
2.使用jieba结巴分词对文本进行中文分词,同时插入字典关于关键词;
3.scikit-learn对文本内容进行tfidf计算并构造N*M矩阵(N个文档 M个特征词);
4.再使用K-means进行文本聚类(省略特征词过来降维过程);
5.最后对聚类的结果进行简单的文本处理,按类簇归类,也可以计算P/R/F特征值;
6.总结这篇论文及K-means的缺点及知识图谱的一些内容。
⑻ TF-IDF计算过程
本文内容主要摘自python machine learning 2nd edition
1、假设我们有以下三个文本
• 'The sun is shining'
• 'The weather is sweet'
• 'The sun is shining, the weather is sweet, and one and one is two
2、利用CountVectorizer类得到如下字典
{'and': 0,'two': 7,'shining': 3,'one': 2,'sun': 4,'weather': 8,'the': 6,'sweet': 5, 'is': 1 }
3、将步骤1的文档转换为矩阵
[[0 1 0 1 1 0 1 0 0]
[0 1 0 0 0 1 1 0 1]
[2 3 2 1 1 1 2 1 1]]
4.计算tf-idf值
我们以is为例进行计算,is对应的是矩阵第二列。
tf值,表示term在该文本中出现的次数,这里即is在文本3出现的次数,很容易看出是3.
idf值,sklearn做了小小的改动,公式是 (1+log ). 的意思就是文本总数(number of document),df(d,t)表示包含is 的文件数目,很明显,这里也是3.这样,计算的结果为3*(1+log )=3.
需要注意的是,sklearn对结果进行了正则化处理。
最终得到的结果为
[[ 0. 0.43 0. 0.56 0.56 0. 0.43 0. 0. ]
[ 0. 0.43 0. 0. 0. 0.56 0.43 0. 0.56]
[ 0.5 0.45 0.5 0.19 0.19 0.19 0.3 0.25 0.19]]
每一行的平方和均为1,这是l2正则化处理的结果。
另外可以看出,原先is的词频是 1 1 3,最终tf-idf值是0.43 0.43 0.45 。
⑼ tf-idf算法python实现
tf-idf=tf*idf
tf是词频,若一个文件中有n个次,词word出现c次;,则tf=c/n
idf是逆文档概率,一共有N个文件,词word在w个文档中出现,则idf=w/N
⑽ Python语言下的机器学习库
Python语言下的机器学习库
Python是最好的编程语言之一,在科学计算中用途广泛:计算机视觉、人工智能、数学、天文等。它同样适用于机器学习也是意料之中的事。当然,它也有些缺点;其中一个是工具和库过于分散。如果你是拥有unix思维(unix-minded)的人,你会觉得每个工具只做一件事并且把它做好是非常方便的。但是你也需要知道不同库和工具的优缺点,这样在构建系统时才能做出合理的决策。工具本身不能改善系统或产品,但是使用正确的工具,我们可以工作得更高效,生产率更高。因此了解正确的工具,对你的工作领域是非常重要的。
这篇文章的目的就是列举并描述Python可用的最有用的机器学习工具和库。这个列表中,我们不要求这些库是用Python写的,只要有Python接口就够了。我们在最后也有一小节关于深度学习(Deep Learning)的内容,因为它最近也吸引了相当多的关注。
我们的目的不是列出Python中所有机器学习库(搜索“机器学习”时Python包索引(PyPI)返回了139个结果),而是列出我们所知的有用并且维护良好的那些。另外,尽管有些模块可以用于多种机器学习任务,我们只列出主要焦点在机器学习的库。比如,虽然Scipy包含一些聚类算法,但是它的主焦点不是机器学习而是全面的科学计算工具集。因此我们排除了Scipy(尽管我们也使用它!)。
另一个需要提到的是,我们同样会根据与其他科学计算库的集成效果来评估这些库,因为机器学习(有监督的或者无监督的)也是数据处理系统的一部分。如果你使用的库与数据处理系统其他的库不相配,你就要花大量时间创建不同库之间的中间层。在工具集中有个很棒的库很重要,但这个库能与其他库良好集成也同样重要。
如果你擅长其他语言,但也想使用Python包,我们也简单地描述如何与Python进行集成来使用这篇文章列出的库。
Scikit-LearnScikit Learn是我们在CB Insights选用的机器学习工具。我们用它进行分类、特征选择、特征提取和聚集。我们最爱的一点是它拥有易用的一致性API,并提供了很多开箱可用的求值、诊断和交叉验证方法(是不是听起来很熟悉?Python也提供了“电池已备(译注:指开箱可用)”的方法)。锦上添花的是它底层使用Scipy数据结构,与Python中其余使用Scipy、Numpy、Pandas和Matplotlib进行科学计算的部分适应地很好。因此,如果你想可视化分类器的性能(比如,使用精确率与反馈率(precision-recall)图表,或者接收者操作特征(Receiver Operating Characteristics,ROC)曲线),Matplotlib可以帮助进行快速可视化。考虑到花在清理和构造数据的时间,使用这个库会非常方便,因为它可以紧密集成到其他科学计算包上。
另外,它还包含有限的自然语言处理特征提取能力,以及词袋(bag of words)、tfidf(Term Frequency Inverse Document Frequency算法)、预处理(停用词/stop-words,自定义预处理,分析器)。此外,如果你想快速对小数据集(toy dataset)进行不同基准测试的话,它自带的数据集模块提供了常见和有用的数据集。你还可以根据这些数据集创建自己的小数据集,这样在将模型应用到真实世界中之前,你可以按照自己的目的来检验模型是否符合期望。对参数最优化和参数调整,它也提供了网格搜索和随机搜索。如果没有强大的社区支持,或者维护得不好,这些特性都不可能实现。我们期盼它的第一个稳定发布版。
StatsmodelsStatsmodels是另一个聚焦在统计模型上的强大的库,主要用于预测性和探索性分析。如果你想拟合线性模型、进行统计分析,或者预测性建模,那么Statsmodels非常适合。它提供的统计测试相当全面,覆盖了大部分情况的验证任务。如果你是R或者S的用户,它也提供了某些统计模型的R语法。它的模型同时也接受Numpy数组和Pandas数据帧,让中间数据结构成为过去!
PyMCPyMC是做贝叶斯曲线的工具。它包含贝叶斯模型、统计分布和模型收敛的诊断工具,也包含一些层次模型。如果想进行贝叶斯分析,你应该看看。
ShogunShogun是个聚焦在支持向量机(Support Vector Machines, SVM)上的机器学习工具箱,用C++编写。它正处于积极开发和维护中,提供了Python接口,也是文档化最好的接口。但是,相对于Scikit-learn,我们发现它的API比较难用。而且,也没提供很多开箱可用的诊断和求值算法。但是,速度是个很大的优势。
GensimGensim被定义为“人们的主题建模工具(topic modeling for humans)”。它的主页上描述,其焦点是狄利克雷划分(Latent Dirichlet Allocation, LDA)及变体。不同于其他包,它支持自然语言处理,能将NLP和其他机器学习算法更容易组合在一起。如果你的领域在NLP,并想进行聚集和基本的分类,你可以看看。目前,它们引入了Google的基于递归神经网络(Recurrent Neural Network)的文本表示法word2vec。这个库只使用Python编写。
OrangeOrange是这篇文章列举的所有库中唯一带有图形用户界面(Graphical User Interface,GUI)的。对分类、聚集和特征选择方法而言,它是相当全面的,还有些交叉验证的方法。在某些方面比Scikit-learn还要好(分类方法、一些预处理能力),但与其他科学计算系统(Numpy, Scipy, Matplotlib, Pandas)的适配上比不上Scikit-learn。但是,包含GUI是个很重要的优势。你可以可视化交叉验证的结果、模型和特征选择方法(某些功能需要安装Graphviz)。对大多数算法,Orange都有自己的数据结构,所以你需要将数据包装成Orange兼容的数据结构,这使得其学习曲线更陡。
PyMVPAPyMVPA是另一个统计学习库,API上与Scikit-learn很像。包含交叉验证和诊断工具,但是没有Scikit-learn全面。
深度学习尽管深度学习是机器学习的一个子节,我们在这里创建单独一节的原因是,它最新吸引了Google和Facebook人才招聘部门的很多注意。
TheanoTheano是最成熟的深度学习库。它提供了不错的数据结构(张量,tensor)来表示神经网络的层,对线性代数来说很高效,与Numpy的数组类似。需要注意的是,它的API可能不是很直观,用户的学习曲线会很高。有很多基于Theano的库都在利用其数据结构。它同时支持开箱可用的GPU编程。
PyLearn2还有另外一个基于Theano的库,PyLearn2,它给Theano引入了模块化和可配置性,你可以通过不同的配置文件来创建神经网络,这样尝试不同的参数会更容易。可以说,如果分离神经网络的参数和属性到配置文件,它的模块化能力更强大。
DecafDecaf是最近由UC Berkeley发布的深度学习库,在Imagenet分类挑战中测试发现,其神经网络实现是很先进的(state of art)。
Nolearn如果你想在深度学习中也能使用优秀的Scikit-learn库API,封装了Decaf的Nolearn会让你能够更轻松地使用它。它是对Decaf的包装,与Scikit-learn兼容(大部分),使得Decaf更不可思议。
OverFeatOverFeat是最近猫vs.狗(kaggle挑战)的胜利者,它使用C++编写,也包含一个Python包装器(还有Matlab和Lua)。通过Torch库使用GPU,所以速度很快。也赢得了ImageNet分类的检测和本地化挑战。如果你的领域是计算机视觉,你可能需要看看。
HebelHebel是另一个带有GPU支持的神经网络库,开箱可用。你可以通过YAML文件(与Pylearn2类似)决定神经网络的属性,提供了将神级网络和代码友好分离的方式,可以快速地运行模型。由于开发不久,就深度和广度上说,文档很匮乏。就神经网络模型来说,也是有局限的,因为只支持一种神经网络模型(正向反馈,feed-forward)。但是,它是用纯Python编写,将会是很友好的库,因为包含很多实用函数,比如调度器和监视器,其他库中我们并没有发现这些功能。
NeurolabNeuroLab是另一个API友好(与Matlabapi类似)的神经网络库。与其他库不同,它包含递归神经网络(Recurrent Neural Network,RNN)实现的不同变体。如果你想使用RNN,这个库是同类API中最好的选择之一。
与其他语言集成你不了解Python但是很擅长其他语言?不要绝望!Python(还有其他)的一个强项就是它是一个完美的胶水语言,你可以使用自己常用的编程语言,通过Python来访问这些库。以下适合各种编程语言的包可以用于将其他语言与Python组合到一起:R -> RPythonMatlab -> matpythonJava -> JythonLua -> Lunatic PythonJulia -> PyCall.jl
不活跃的库这些库超过一年没有发布任何更新,我们列出是因为你有可能会有用,但是这些库不太可能会进行BUG修复,特别是未来进行增强。MDPMlPyFFnetPyBrain如果我们遗漏了你最爱的Python机器学习包,通过评论让我们知道。我们很乐意将其添加到文章中。