《机器学习实战》4.朴素贝叶斯

2023-11-20

目录

 

1.基于贝叶斯决策理论的分类方法

2.利用朴素贝叶斯进行文档分类

一般过程:

3.使用python进行文本分类

3.1准备数据:从文本中构建词向量

3.2 训练算法:从词向量计算概率

3.3测试算法:根据现实情况修改分类器

3.4 准备数据:文档词袋模型

4 示例:使用朴素贝叶斯过滤垃圾邮件

4.1 准备数据:切分文本

4.2 测试算法:使用朴素贝叶斯进行交叉验证

 5 示例:使用朴素贝叶斯分类器从个人广告中获取区域倾向

 5.1 收集数据:导入RSS源

5.2 分析数据:显示地域相关的用词

6 本章小结

本章涉及到的相关代码和数据

这本书的前两章要求分类器做出艰难决策,给出“该数据实例属于哪一类”这类问题的明确答案。不过,分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时给出这个猜测的概率估计值。  

优点:在数据较少的情况下仍然有效,可以处理多类别的问题  

缺点:对于输入数据的准备方法较为敏感  

 使用数据类型:标称型数据  

1.基于贝叶斯决策理论的分类方法

核心思想:选择高概率对应的类别  

2.利用朴素贝叶斯进行文档分类

机器学习的一个重要的应用就是文档的自动分类。  

我们可以观察文档中出现的词,并把每个词的出现或不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词数目一样多。朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法  

朴素:每个条件是相对独立的,互不影响,完全条件无关,在数学上称之为朴素

一般过程:

1.收集数据:可以使用任何方法,本章使用RSS源  

2.准备数据:需要数值型或者布尔型数据  

3.分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好  

4.训练数据:计算不同的独立特征的条件概率  

5.测试算法:计算错误率  

6.使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定是文本  

由统计学可知,如果每个特征需要N个样本,那么对于10个特征将需要N的十次方个样本

如果特征之间相互独立,那么样本数就可以从N的1000次方减少到1000*N

朴素的含义:1.各特征相互独立  2.每个特征同等重要

3.使用python进行文本分类

要从文本中获取特征,需要先拆分文本  

这里的特征是来自文本的词条,一个词条是字符的任意组合。可以把词条想象成单词,也可以使用非单词词条,如URL、IP地址或者其他任意字符串。然后将每个文本片段表示为一个词条向量,其中值为1表示出现在文档中,值为0表示未出现  

3.1准备数据:从文本中构建词向量

把文本看成单词向量或词条向量,也就是说把句子转换为向量。考虑出现在所有文档中的所有单词,再决定将哪些词纳入词汇表或者说所要的词汇集合,然后必须要将每一篇文档转换为词汇上的向量

# 词表到向量的转换函数
# 创建实验样本
def loadDataSet():
    # 进行词条切分后的文档集合
    postingList=[['my','dog','has','flea','problems','help','please'],['maybe','not','take','him','to','dog','park','stupid'],['my','dalmation','is','so','cute','I','love','him'],['stop','posting','stupid','worthless','garbage'],['mr','licks','ate','my','steak','how','to','stop','him'],['quit','buying','worthless','dog','food','stupid']]
    # 1代表侮辱性文字,0代表正常言论
    # 这些文本的类别由人工标注,这些标注信息用于训练程序以便自动检测侮辱性留言
    classVec=[0,1,0,1,0,1]
    return postingList,classVec

# 创建一个包含所有文档中不重复词的列表
def createVocabList(dataSet):
    # set构造函数,返回一个不重复词表
    # 先创建一个空集合
    vocabSet=set([])
    # 将每篇文档返回的新词集合添加到该集合中
    for document in dataSet:
        # |求两个集合的并集
        vocabSet=vocabSet|set(document)
    # 返回list的不重复词表
    return list(vocabSet)


# 输出文档向量,向量的每一元素为1或0,分别表示词汇表中的单词在输入文档中是否出现
# 输入               词汇表     文档
def setOfWords2Vec(vocabList,inputSet):
    # 创建一个所含元素都为0的向量
    returnVec=[0]*len(vocabList)
    # 遍历每个词汇,如果在文档里,向量为1,如果不在,向量为0
    # 遍历文档中的每一个单词
    for word in inputSet:
        # 检查其是否在词汇表中
        if word in inputSet:
            # 在的话就对应向量处为1
            returnVec[vocabList.index(word)]=1
        else:
            # 不在的话则输出该单词不在字典里
            print("这个单词%s不在字典里" %word)
    # 返回最终得到的向量
    return returnVec

调用上面定义的loadDataSet()函数和createVocabList()函数运行可得到结果

listOposts,listClasses=loadDataSet()
myVocabList=createVocabList(listOposts)
listOposts,listClasses,myVocabList

得到的运行结果为:

 然后调用色图OfWordsVec()函数可得到词向量

setOfWords2Vec(myVocabList,listOposts[0])

运行结果为:

3.2 训练算法:从词向量计算概率

利用贝叶斯进行计算

# 朴素贝叶斯分类器训练函数
import numpy as np
          # 文档向量矩阵      每篇文档类别标签所构成的向量
def trainNB0(trainMatrix,trainCategory):
    # 得到文档矩阵的数量
    numTrainDocs=len(trainMatrix)
    # 得到第一个文档的长度
    numWords=len(trainMatrix[0])
    # 得到属于侮辱性文档的概率
            #   属于侮辱性文档的数量/文档数量
    pAbusive=sum(trainCategory)/float(numTrainDocs)
    # 生成一个numWords*1的全是0的矩阵
    p0Num=np.zeros(numWords)
    p1Num=np.zeros(numWords)
    # 初始化概率
    p0Denom=0.0   #不属于侮辱性文章的概率
    p1Denom=0.0   #属于侮辱性文章的概率
    # 遍历每个文档
    for i in range(numTrainDocs): 
        # 如果是侮辱类文字
        if trainCategory[i]==1:
            # 向量相加,直接在后面相加一个矩阵
            p1Num+=trainMatrix[i]
            p1Denom+=sum(trainMatrix[i])
        else:
            p0Num+=trainMatrix[i]
            p0Denom+=sum(trainMatrix[i])
    # 对每个元素做除法得到条件概率
    p1Vect=p1Num/p1Denom
    p0Vect=p0Num/p0Denom
    # 返回属于侮辱性文字的概率、不属于侮辱性文字的概率 侮辱性文档的概率
    return p0Vect,p1Vect,pAbusive

调用上面定义的函数并运行可得到

myVocabList=createVocabList(listOposts)
# 不重复的所有词列表
print(myVocabList)
# 创建一个空的列表
trainMat=[]
# 得到一个向量列表
for postinDoc in listOposts:
    # 关于此列表是否在listOposts文档中
    trainMat.append(setOfWords2Vec(myVocabList,postinDoc))

print(trainMat)
#           所有文档的向量列表   分类的类别
p0V,p1V,pAb=trainNB0(trainMat,listClasses)
# 输入侮辱性文档的概率  两个类别的概率向量
pAb,p0V,p1V

运行结果为:

 可以看到先是输出了所有的不重复词列表,和所有文档的向量列表

然后下面输出了输入侮辱性文档的概率和两个类别每个词分别的概率矩阵

3.3测试算法:根据现实情况修改分类器

# 修改trainNB0()函数
# import numpy as np 

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs=len(trainMatrix)
    numWords=len(trainMatrix[0])
    # 得到属于侮辱性文档的概率
    pAbusive=sum(trainCategory)/float(numTrainDocs)

    # 为防止概率为0的数据对结果造成影响,将所有词的出现数设置为1,并将分母初始化为2
    # 生成一个numWords*1的全是1的矩阵
    p0Num=np.ones(numWords)
    p1Num=np.ones(numWords)
    # 初始化概率
    p0Denom=2.0
    p1Denom=2.0
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
            # 向量相加
            p1Num+=trainMatrix[i]
            p1Denom+=sum(trainMatrix[i])
        else:
            p0Num+=trainMatrix[i]
            p0Denom+=sum(trainMatrix[i])

    # 因为太多过于小的数相乘,或造成下溢出
    # 防止下溢出,造成结果不正确,因此采用自然对数进行处理防止这种损失
    # 对每个元素做除法得到条件概率
    p1Vect=np.log(p1Num/p1Denom)
    p0Vect=np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive


# 朴素贝叶斯分类函数
        #   要分类的向量  三个概率
def classifyNB(vec2Classfy,p0Vec,p1Vec,pClass1):
    
    p1=sum(vec2Classfy*p1Vec)+np.log(pClass1)
    p0=sum(vec2Classfy*p0Vec)+np.log(1.0-pClass1)
    # 如果p1的概率大于p0的概率,则类别为1
    if p1>p0:
        return 1
    # 反之则为0
    else:
        return 0

检测分类效果

def testingNB():
    # 加载原始数据
    list0Posts,listClasses=loadDataSet()
    # 得到不重复单词列表
    myVocabList=createVocabList(list0Posts)
    # 创建一个空向量
    trainMat=[]
    # 遍历原始文档列表中的每个文档
    for postinDoc in list0Posts:
        # 得到文档向量矩阵
        trainMat.append(setOfWords2Vec(myVocabList,postinDoc))
        # 得到三个概率
    p0V,p1V,pAb=trainNB0(np.array(trainMat),np.array(listClasses))
    # 定义测试数据
    testEntry=['love','my','dalmation']
    # 得到测试文档向量列表
    thisDoc=np.array(setOfWords2Vec(myVocabList,testEntry))
    # 输出测试数据的概率
    print (testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))
    # 再次定义测试数据
    testEntry=['stupid','garbage']
    # 得到测试文档的向量列表
    thisDoc=np.array(setOfWords2Vec(myVocabList,testEntry))
    # 输出测试数据的概率
    print (testEntry,'classfied as:',classifyNB(thisDoc,p0V,p1V,pAb))

运行这个函数

testingNB()

得到的运行结果为:

3.4 准备数据:文档词袋模型

将每个词的出现与否作为一个特征->词集模型

每个词出现的次数作为特征->词袋模型

def bagOfWords2VecMN(vocabList,inputSet):
    returnVec=[0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)]+=1
    return returnVec

4 示例:使用朴素贝叶斯过滤垃圾邮件

收集数据:提供文本文件  

准备数据:将文本文件解析成词条向量  

分析数据:检查词条确保解析的完整性  

训练算法:使用我们之前建立的trainNB0()函数  

测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率  

使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上  

4.1 准备数据:切分文本

mySent='This book is the best book on python or M.L. I have ever laid eye upon.'
# split函数默认分隔符为空格
mySent.split()

得到的运行结果为:

可以看到切分的效果还具有标点符号,可以使用正则表达式切分句子,以此来去掉标点符号

import re
# \\W+除字母数字意外的符号
regEx=re.compile('\\W+')
listOfTokens=regEx.split(mySent)
listOfTokens

 得到的结果为:

 还有一种正则表达式为分开所有字符:

# 分开所有字符
regEx1=re.compile('\\W*')
listOfTokens1=regEx1.split(mySent)
listOfTokens1

得到的运行结果为:

 去掉所有空格

[tok for tok in listOfTokens if len(tok)>0]

得到:

 或者直接将所有字母转为小写

# .lower()函数将所有单词转为小写    .upper()函数将所有的那次转为大写
[tok.lower() for tok in listOfTokens if len(tok)>0]

得到结果为

4.2 测试算法:使用朴素贝叶斯进行交叉验证

文件解析及完整的垃圾邮件测试函数

# 解析为字符串列表
def textParse(bigString):
    import re
    # 进行正则表达式拆分
    listOfTokens=re.split('\W+',bigString)
    # 过滤掉字母长度小于3的单词并转为小写
    return [tok.lower() for tok in listOfTokens if len(tok)>2]

import random
import numpy as np

# 对贝叶斯邮件分类器做自动化处理
def spamTest():
    docList=[]
    classList=[]
    fullText=[]
    # 导入并解析准备好的26个文本文件
    for i in range(1,26):
        worldList = textParse(open('email/spam/%d.txt' % i).read())
        # worldList=textParse(open('email/spam/%s.txt' % str(i) ).read())
        docList.append(worldList)
        fullText.extend(worldList)
        classList.append(1)
        worldList=textParse(open('email/ham/%d.txt' % i).read())
        docList.append(worldList)
        fullText.extend(worldList)
        classList.append(0)
    # 得到不重复词列表
    vocabList=createVocabList(docList)
    trainingSet=list(range(50))
    testSet=[]
    # 随机选择十封邮件构测试集
    # 训练集中的数据用来进行概率计算
    for i in range(10):
        # 拿到一个随机数 大于0小于训练集长度的一个随机整数
        randIndex=int(random.uniform(0,len(trainingSet)))
        # 加入到测试集中
        testSet.append(trainingSet[randIndex])
        # 选为了训练集的邮件从测试集中剔除
        del(trainingSet[randIndex])
    trainMat=[]
    trainClasses=[]
    # 遍历训练集,拿到训练集向量
    for docIndex in trainingSet:
        trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
        trainClasses.append(classList[docIndex])
    # 对训练集进行训练,拿到所需要的概率值
    p0V,p1V,pSpam=trainNB0(np.array(trainMat),np.array(trainClasses))
    errorCount=0
    # 对测试级进行分类
    for docIndex in testSet:
        wordVector=setOfWords2Vec(vocabList,docList[docIndex])
        # 如果得出的分类结果与本身结果不同,错误数+1
        if classifyNB(np.array(wordVector),p0V,p1V,pSpam)!=classList[docIndex]:
            errorCount+=1
    print("the error rate is:",float(errorCount/len(testSet)))

spamTest()

得到的运行结果为:

 5 示例:使用朴素贝叶斯分类器从个人广告中获取区域倾向

分别从美国的两个城市中选取一些人,通过分析这些人发布的征婚广告信息,来比较这两个城市中的人们在广告用词上是否不同。  

如果结论确实是不同,那么他们各自常用的词是哪些  

从人们的用词当中,我们能否对不同城市的人所关心的内容有所了解  

使用朴素贝叶斯来发现地域相关的用词  

①收集数据:从RSS源收集内容,这里需要对RSS源构建一个接口  

②准备数据:将文本文件解析成词条向量  

③分析数据:检查词条向量确保解析的准确性

④训练算法:使用我们之前建立的trainNB0()函数  

⑤测试算法:观察错误率,确保分类器可用。可以修改切分程序,以降低错误率,提高分类结果

⑥使用算法:构建一个完整的程序,封装所有的内容。给定两个RSS源,该程序会显示最常用的公共词  

 5.1 收集数据:导入RSS源

检查选择的rss源中是否有数据

import feedparser
# 书中提供的RSS源已经不可访问,此处换了一个RSS源
# 检测解析到的RSS源数据是否有数据
ny=feedparser.parse('https://www.sup.org/rss/?feed=history')
ny['entries']
# 输出数据条数,如果为0则是没有数据
len(ny['entries'])

运行结果:

import numpy as np
# RSS源分类器及高频词去除函数
def calcMostFreq(vocabList,fullText):
    import operator
    freqDict={}
    for token in vocabList:
        # 计算每个单词出现的次数
        freqDict[token]=fullText.count(token)
        # 按照逆序从大到小对freqDict进行排序
    # iteritems()是python2中的函数,该函数在python3中为tiems()
    sortedFreq=sorted(freqDict.items(),key=operator.itemgetter(1),reverse=True)
    # 返回前30个高频单词
    return sortedFreq[:30]

# 参数为两个解析过的RSS数据源
def localWords(feed1,feed0):
    import feedparser
    docList=[]
    classList=[]   # 分类标签
    fullText=[]
    # 拿到两个数据长度最小的那个长度
    minLen=min(len(feed1['entries']),len(feed0['entries']))    #50
    print(minLen)
    # 遍历连个源数据的前50条数据。并设置分类向量
    for i in range(minLen):
        # 每次访问一条RSS源
        worldList=textParse(feed1['entries'][i]['summary'])    
        # 得到文档矩阵   
        docList.append(worldList)
        # 得到一条包含文档中所有词的列表
        fullText.extend(worldList)
        # 添加分类标签
        classList.append(1)
        worldList=textParse(feed0['entries'][i]['summary'])
        docList.append(worldList)
        fullText.extend(worldList)
        classList.append(0)
    # 得到包含所有不重复词的列表
    vocabList=createVocabList(docList)
    # 得到出现频率最高的前三十个词,一般都是the、a、等常用单词,与分类无关
    top30Words=calcMostFreq(vocabList,fullText)
    # 遍历这三十个词
    for pairw in top30Words:
        # 如果这个单词在不重复列表中
        # print('0')
        # print(pairw)   #('the', 482)  单词+频数在一起
        # print(pairw[0])
        if pairw[0] in vocabList:
            # 从列表中删除这个词
            vocabList.remove(pairw[0])    #取pairw[0]就是该单词
    # 设置一个训练集
    trainingSet=list(range(2*minLen))
    # 一个测试集
    testSet=[]
    # 随机选择20条数据放到测试集中
    for i in range(20):
        randIndex=int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat=[]
    trainClasses=[]
    for docIndex in trainingSet:
        # 得到单词和单词出现的频数
        trainMat.append(bagOfWords2VecMN(vocabList,docList[docIndex]))

        trainClasses.append(classList[docIndex])  # 添加分类标签
        # 得到分类概率
    p0V ,p1V,pSpam=trainNB0(np.array(trainMat),np.array(trainClasses))
    errorCount=0
    for docIndex in testSet:
        worldVector=bagOfWords2VecMN(vocabList,docList[docIndex])
        # if classifyNB(np.array(wordVector),p0V,p1V,pSpam)!=classList[docIndex]:
        # 计算错误率
        if classifyNB(np.array(worldVector),p0V,p1V,pSpam)!=classList[docIndex]:
            errorCount+=1
    print('the error rate is :',float(errorCount)/len(testSet))
    return vocabList,p0V,p1V

 运行上面函数的结果:

ny=feedparser.parse('https://tomaugspurger.github.io/feeds/all.atom.xml')
sf=feedparser.parse('https://www.sup.org/rss/?feed=history')
vocabList,pSF,pNY=localWords(ny,sf)

运行:

5.2 分析数据:显示地域相关的用词

# 显示最具有表征性的词
def getTopWords(ny,sf):
    import operator
    vocabList,p0V,p1V=localWords(ny,sf)
    topNY=[]
    topSF=[]
    for i in range(len(p0V)):
        if p0V[i]>-6.0:
            topSF.append((vocabList[i],p0V[i]))
        if p1V[i]>-6.0:
            topNY.append((vocabList[i],p1V[i]))
    sortedSF=sorted(topSF,key=lambda pair:pair[1],reverse=True)
    print('SF********************')
    for item in sortedSF:
        print(item[0])
    sortedNY=sorted(topNY,key=lambda pair:pair[1],reverse=True)
    print('NY********************')
    for item in sortedNY:
        print(item[0])

getTopWords(ny,sf)

得到的运行结果为:

6 本章小结

对于分类而言,使用概率有时要比使用硬规则更有效

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《机器学习实战》4.朴素贝叶斯 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 在本地网络上运行 Bokeh 服务器

    我有一个简单的 Bokeh 应用程序 名为app py如下 contents of app py from bokeh client import push session from bokeh embed import server do
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 在 JavaScript 函数的 Django 模板中转义字符串参数

    我有一个 JavaScript 函数 它返回一组对象 return Func id name 例如 我在传递包含引号的字符串时遇到问题 Dr Seuss ABC BOOk 是无效语法 I tried name safe 但无济于事 有什么解

随机推荐

  • sqlite升级

    最近开发中遇到了需要改变项目数据库的表中字段 添加新表等需求 而又需要保证原有数据不变 这就涉及到数据库升级 现在就来总结记录一下 包含原表中增加字段 删除字段 修改字段 添加新表等四种升级操作 SQLiteOpenHelper类中有两个方
  • 华为校招机试题-猜字谜-2023年

    题目描述 小王设计了一个简单的猜字谜游戏 游戏的谜面是一个错误的单词 比如nesw 玩家需要猜出谜底库中正确的单词 猜中的要求如下 对于某个谜面和谜底单词 满足下面任一条件都表示猜中 1 变换顺序以后一样的 比如通过变换w和e的顺序 nwe
  • App隐私监管新规实施 隐私合规检测要注意这几点?

    5月1日 国家四部委联合制定的 常见类型移动互联网应用程序必要个人信息范围规定 简称 规定 将正式实施 规定 明确移动互联网应用程序 App 运营者不得因用户不同意收集非必要个人信息 而拒绝用户使用App基本功能服务 要求各地各相关单位督促
  • Linux创建文件的5种方式

    Linux创建文件的5种方式 1 touch 1 1 创建一个文件 touch yyTest ini 1 2 同时创建两个文件 touch test1 txt test2 txt 1 3 批量创建文件 如创建2000个文件 touch te
  • 自定义modal转场动画,滑动手势控制 dismiss 过程

    效果 假设有 1 两个视图控制器 presentingVC presentedVC 2 一个继承于UIPercentDrivenInteractiveTransition 并遵守协议UIViewControllerAnimatedTrans
  • java上传Base64编码格式的图片

    工具类 public class ImageBase64Converter 本地文件 图片 excel等 转换成Base64字符串 param imgPath public static String convertFileToBase64
  • LWIP学习笔记(2)---IP协议

    IP首部 最高位在左边记为 bit 最低位在右边 记为31 bit 传输顺序 先0 7bit 在8 15bit 然后16 13 最后24 31bit 这种方式称为 big endian 也叫网络字节序 版本 ipv4 或 6 ipv6 首部
  • Scanner类: next() 与 nextLine()与nextInt()

    next nextLine nextInt 是scanner内置的方法 next 1 一定要读取到有效字符后才可以结束输入 2 对输入有效字符之前遇到的空白 next 方法会自动将其去掉 3 只有输入有效字符后才将其后面输入的空白作为分隔符
  • 从零开始入门 K8s

    作者 至天 阿里巴巴高级研发工程师 一 基本知识 存储快照产生背景 在使用存储时 为了提高数据操作的容错性 我们通常有需要对线上数据进行 snapshot 以及能快速 restore 的能力 另外 当需要对线上数据进行快速的复制以及迁移等动
  • 解决cmd命令行运行java程序,编译通过,执行时却找不到主类的问题

    命令行中使用javac命令编译Train通过 使用java命令运行却找不到主类Trian 原因 有package的存在 编译成功后 需要返回上一层文件目录使用java命令执行train Trian 即 java命令后跟 包名称调用主类名称
  • Ubuntu和Windows使用Mmdetection训练Swin-Transformer+Mask-RCNN

    最近想用各种SOTA的Swin Transformer来试试实例分割效果 于是找了一下教程实验了一下 主要分为以下步骤 1 安装Mmdetection 这部分的教程很多 网上搜一下就行了 但是这里出错最多 2 下载Swin Transfor
  • java 获取list中的两两组合,给定一个数组,获取排列组合

    如题 获取一个数组中两两组合 示例 给定一个List lt 1 2 3 4 gt 输出 1 2 1 3 1 4 2 3 2 4 3 4 demo public static void main String args List
  • 几率大的网络安全面试题(含答案)

    其他面试题类型汇总 Java校招极大几率出的面试题 含答案 汇总 几率大的网络安全面试题 含答案 几率大的多线程面试题 含答案 几率大的源码底层原理 杂食面试题 含答案 几率大的Redis面试题 含答案 几率大的linux命令面试题 含答案
  • 【Linux】 Linux使用timedatectl命令修改时间报错

    Linux中可以使用timedatectl命令来修改系统时间信息 具体命令中常见的参数格式及作用如下 参数 作用 status 显示状态信息 list timezones 列出已知时区 set time 设置系统时间 set timezon
  • STM32学习笔记——USB鼠标

    最近搞了好久的STM32模拟USB鼠标 功能就是简单的利用三个按键实现滚轮和鼠标左右键的功能 USB功能其实已经集成好一个库了 我们只是对其中几个函数进行配置而已 其实很多配置还不是太懂 整个USB程序的过程大概就是1 中断配置 2 USB
  • 【win10】 设置应用开机自启动

    步骤如下 1 按Win r键 输入 shell startup 2 确定后会出现一个文件夹 把要开机启动的应用快捷方式放到里面 3 在任务管理器的启动里面进行设置 可以在状态字段选择启用或者禁用 放在文件夹里只是让它可以在任务管理器的启动里
  • jdk与jre的区别

    jdk与jre的区别 很多程序员已经干了一段时间java了依然不明白jdk与jre的区别 JDK就是Java Development Kit 简单的说JDK是面向开发人员使用的SDK 它提供了Java的开发环境和运行环境 SDK是Softw
  • 解决Ubuntu 20.04 node-v 和nodejs --version显示不同版本

    Ubuntu 20 04 node v 和nodejs version显示不同版本 1 删除原来的node js版本以及之前的软链接 我这里是输入node v显示4 0 0pre 首先要删除 卸载这个版本对应的node js文件 此时如果在
  • Match Points【Codeforces 1156C】【二分答案】

    题目链接 题意有点像上海EC某年的一道铜牌题 具体是哪年记不得了 我们要去N个的关系 使得最多的匹配对达到他们的差值 Z 这样的情况 有这样的一组数据可以很好的反映这道题为什么有人会WA了 4 3 1 4 5 7 但是 同时也证明了 我们取
  • 《机器学习实战》4.朴素贝叶斯

    目录 1 基于贝叶斯决策理论的分类方法 2 利用朴素贝叶斯进行文档分类 一般过程 3 使用python进行文本分类 3 1准备数据 从文本中构建词向量 3 2 训练算法 从词向量计算概率 3 3测试算法 根据现实情况修改分类器 3 4 准备