精华内容
下载资源
问答
  • 谈谈自己的理解。 1.对于数组,想要知道长度,直接.length(是个属性);...总结:size大小大小听起来像是一个动态的词语,对应长度可变的list map;而length长度听起来则是一个固定的形容,对应长度不可变的数组。 ...

    谈谈自己的理解。

    1.对于数组,想要知道长度,直接.length(是个属性);数组长度是不可变的;

    2.对于list map等容器,想要知道大小,.size() (是个方法);长度是可变的;

    总结:size大小大小听起来像是一个动态的词语,对应长度可变的list map;而length长度听起来则是一个固定的形容,对应长度不可变的数组。

    展开全文
  • 迷你数据中心为何物?

    2017-07-03 17:16:00
    数据中心种类很多,给数据中心作了很多分类目的往往是为了突出其某个方面特征。比如:模块化的数据中心,强调数据中心是由诸多...数据中心前面的形容词语决定了这个数据中心最大特征。几年前,我们总提...

    数据中心的种类很多,给数据中心作了很多分类的目的往往是为了突出其某个方面的特征。比如:模块化的数据中心,强调的是数据中心是由诸多功能模块堆砌起来的;软件定义数据中心,强调的是软件在数据中心里的作用;家庭数据中心,强调的是将家里的电子设备进行互联,组成一个小型数据中心,诸如此类的还有很多。数据中心前面的形容词语决定了这个数据中心的最大特征。几年前,我们总提云数据中心,这个概念太过笼统,一时间几乎所有的数据中心都说自己是云数据中心,而现在出现的各种类型数据中心,是突出强调了某一特定应用场景,更具有实际意义。本文将要讲到的就是一种新的数据中心类型,它叫迷你数据中心,这个名字听起来就挺酷,那让我们来看看究竟迷你数据中心为何物?

    迷你数据中心是网络巨头思科提出来的一种数据中心解决方案。迷你是外来语,是由英文MINI一词转化而成的,意为小的、袖珍型的,通常形容小巧可爱的物品。迷你数据中心当然强调的就是规模小,这样的数据中心可能不具备数据中心的所有特征,但依然可以将数据中心的部分先进技术应用起来。迷你数据中心主要面向的是中小企业,使用部分大型企业所使用的数据中心技术,在保持较低投资和运营开支的同时,满足不断扩展的业务需求。迷你数据中心为中小企业用户构建一个具有一定弹性的,模块化的IT架构,即可以使用较少的费用构建一个满足当前需要的IT架构,但是为未来的应用需求增长也提供了足够的扩展能力,可以较易扩展到更大的规模。迷你数据中心和微模块数据中心、手提数据中心一样,都强调了数据中心规模小,除此之外,迷你数据中心还强调了扩展性,这个在以往的数据中心类型中并没有提及。

    首先,迷你数据中心要具备云数据中心的各项基本功能,比如:支持服务器和网络的虚拟化,实现虚机跨三层网络的无感知迁移,这样既提升了系统运行的可靠性,又避免部分服务器长时间闲置,大大提升数据中心运行效率;为数据中心提供统一的管理模式,数据中心里的设备不再是孤立运行的,而是相互关联的,使用统一的软件进行管理;迷你数据中心也有模块化,在功能上将数据中心划分为不同模块单元,“麻雀虽小,五脏俱全”,不能因为规模小,就在功能模块上有缺失,该有的功能一定要有,功能丰富。迷你数据中心具有了云数据中心应用的一些基本特征,虽然并不实际部署云计算、大数据、SDN等这些大型数据中心才拥有的应用,但迷你数据中心具备未来扩展,部署这些功能的能力。

    其次,可扩展性是迷你数据中心的主要特征。随着数据中心规模和业务的不断扩展,需要数据中心可以支持更多用户,或部署新应用,用于满足需求的服务器数目也在不断增加。当数据中心现有服务器机房网络容量无法再满足其需求时,就会要求对现有数据中心进行扩容,但是许多因素都会限制数据中心架构的扩展,如机架空间、供电、通风、交换机吞吐率、可用端口数目等。因此数据中心需要构建一个具有弹性的架构,可随业务需求的发展,平稳扩展,这时就需要将数据中心建设成为迷你型的,现在的数据中心是中小型的,但未来也可以扩展成大型的,只要现阶段是迷你型的数据中心就可以满足未来扩容需求。实现可扩展性的基础,还是要求数据中心要支持功能模块化,每个部分的功能都是具有一定独立性的,这样在扩展起来就容易得多。还有要有统一接口,所有设备使用统一规划,统一管理,为未来的扩容留有设计接口,所有功能模块的设计实现均考虑到了扩展性,为未来扩容留有余地。

    第三,迷你数据中心是简化版的数据中心,具有数据中心可视、可控、可管理的虚拟化功能,对数据中心所有模块实行统一管理,并满足灵活扩展。迷你数据中心并不具备数据分析能力和高速分布式计算的能力,甚至无法部署各种云应用,但这并不影响迷你数据中心的使用。中小型数据中心主要应用往往集中于如:文件共享、电子邮件、数据库应用和Web 服务等,这些即便不是迷你的数据中心,也能做到。但随着时间的推移,对于更高处理能力、存储容量和分别控制特定服务器的运营等需求出现时,迷你数据中心就会发挥出其巨大的优势,体现出迷你数据中心的优势。

    实际上,不止思科,惠普、曙光等企业也都曾提及迷你数据中心解决方案。不管在数据中心前面加上什么样的形容语,炒作意味尤为明显,更像是一种市场营销的手段,这些各种数据中心解决方案,具体到应用上,最终还是推荐一系列的新产品。说到底迷你数据中心就是面向中小企业,提供一整套产品的解决方案,目标就是中小企业,不管是叫微数据中心,还是模块数据中心,或是本文所讲的迷你数据中心,都是面向的这块市场。这些中小企业虽然当前无法拥有大规模的计算设备,却也希望尝试部署新的数据中心技术,以便改善业务运营的效率,并为未来的扩容做准备,迷你数据中心针对的就是这样的一些潜在用户。大型数据中心虽然采购规模很大,但是数量较少,而中小型的数据中心才是海量的,在我国近50万个数据中心里,超过90%的数据中心拥有的机架数量都不超过1000个,中小型数据中心数量非常多,这块才是真正诱人的市场。



    本文转自d1net(原创)

    展开全文
  • 已经为了这个检索项目写了差不多2年代码了,回想大四下学期就开始接触这个项目,在研一时候根本不知道科研如何做,而且项目就自己一个人,也是胡乱写了代码,而且心事太多,简直只能用一个词语形容就是混乱。...
    已经研究生二年级下学期了,已经为了这个检索项目写了差不多2年代码了,回想大四下学期就开始接触的这个项目,在研一的时候根本不知道科研如何做,而且项目就自己一个人,也是胡乱写了代码,而且心事太多,简直只能用一个词语形容就是混乱。
    

      但是在大二上学期10月份的时候,随着一位同学加入简直就是可以说这个项目才真正开始。在我们的系统完成后,我便心血来潮整理我之前写过的代码,因为我们要写论文,所以需要做很多的数据处理来完成实验对比部分,其实这部分数据处理我在大一的时候就已经写过类似的代码,结果现在不得不重新再写,因为写的时间比回想代码时候更短,所以我发现好多代码都重复写了,这是我整理代码的初衷。我更加想的是用一个文件树的数据结构+数据处理算法流程去流水化我们数据处理模块,以后数据处理的代码就可以复用,干苦力的总是应该想办法提高自己的工作效率。所以我带着这个想法实现了下面这个类。用Python写的,因为Python做数据处理,字符处理,批处理真的太便利。其实这个类或许只能我自己用,为什么我会写出一个博客来,或许是因为以后我带研一新生做论文的时候我会让他去看回我们所写过的代码。让他去用我们写过的代码,我并没太多时间带一个新生,所以我让他来看我的博客。

      我的数据结构其实就是个多叉树,用来表示文件目录结构。每一个结点其实就是一个文件,并且用栈和队列实现遍历树的算法,实现添加节点的算法。直接上代码了,以后有时间的时候在回来写注释:

    import os
    from strOp import strExt
    from collections import deque
    from tblOp import tblConcat
    
    class FileNode:
        def __init__(self, _fileName_s='',
                     _brothers=None,
                     _sons=[],
                     _isDir_b=False,
                     _parent= None
                     ):
            self.fileName_s = _fileName_s
            self.bro = _brothers
            self.sons = _sons
            self.isDir_b = _isDir_b
            self.parent = _parent
    
    def addNodeUnderPathUnrecur(root, _path_s):
        ''' inputs: 
                root -> the root of directory tree. It must give the root of the d
                _path_s -> add the sons under the path of _path_s. 
                           if _path_s is equal to 'D:\\CS_DATA\\' 
                           then all the file under it is added as sons of the node named 'CS_DATA'
            outputs:
                Add all the files under _path_s as its sons. The input must give the root of directory
        '''
        node = searchNodeFromGivenFilePath(root, _path_s)
        filesUnderPath = os.listdir(_path_s)
        lenOfFilesUnderPath = len(filesUnderPath)
        for i in range(lenOfFilesUnderPath):
            if len(node.sons) == 0:
                newNode = FileNode(filesUnderPath[i], None, [], os.path.isdir(_path_s+filesUnderPath[i]), node)
                node.sons.append(newNode)
            else:
                newNode = FileNode(filesUnderPath[i], None, [], os.path.isdir(_path_s+filesUnderPath[i]), node)
                node.sons[len(node.sons)-1].bro = newNode
                node.sons.append(newNode)
                #isSameName(node, newNode) file system will ensure that no the same name files exist.
    
    def searchNodeFromGivenFilePath(root, _path_s):
        ''' inputs: 
                root -> Must give the root of directory. Meaning the absolute path of a node.
                _path_s -> The absolute path of a node. Examples: 'D:\\CS_DATA\\'
            output:
                Search the directory tree from root to find the node whose fileName_s is equal to 'CS_DATA'.
                So, you must give the absolute path. Whether 'D:\\CS_DATA\\' or 'D:\\CS_DATA' would be fine.
        '''
        if _path_s[-1] != '\\':
            _path_s += '\\'
        
        folderStructure = _path_s.split('\\')
        if root.bro != None:
            print 'input root is not root of file tree'
            return
        if folderStructure[0] != root.fileName_s:
            print 'the head of input path is not same as root'
            return
        stack = []
        stack.append(root)
        for i in range(1,len(folderStructure)-1):
            if len(stack) == 0:
                print 'stack is empty'
                break
            node = stack.pop()
            flag = 0
            for j in node.sons:
                if folderStructure[i] == j.fileName_s:
                    stack.append(j)
                    flag = 1
            if flag == 0:
                print 'can not find the folder %s' % folderStructure[i]
                return None
        node = stack.pop()
        return node
    
    def addNodeAsSonFromGivenNode(root, _sonPath_s):
        ''' inputs:
                root -> The root of the directory. Which directory that you want to add the node.
                _sonPath_s -> The absolute path of added node. 
                Examples: 'D:\\CS_DATA\\tree\\' means add the node named 'tree' to its parent 'CS_DATA'
            outputs:
                The directory tree with added node.
        '''
        if _sonPath_s[-1] != '\\':
            _sonPath_s += '\\'
        fileStructure = _sonPath_s.split('\\')
        lenOfFileStructure = len(fileStructure)
        if lenOfFileStructure <= 2:
            print 'These is not son in the input path %s' % _sonPath_s
            return
        
        _sonFileName_s = fileStructure[-2]
        _parentPath_s = ''
        for i in range(len(fileStructure)-2):
            _parentPath_s = _parentPath_s + fileStructure[i] + '\\'
        _addNodeAsSonFromGivenNode(root, _parentPath_s, _sonFileName_s)
    
    def _addNodeAsSonFromGivenNode(root, _parentPath_s, _sonFileName_s):
        ''' inputs:
                root -> The root of directory tree.
                _parentPath_s -> The absolute path of parent
                _sonFileName_s -> the filename of added node
            outputs:
                This function is a auxiliary function of addNodeAsSonFromGivenNode
        '''
        if _parentPath_s[-1] != '\\':
            _parentPath_s += '\\'
        
        parentNode = searchNodeFromGivenFilePath(root, _parentPath_s)
        if parentNode == None:
            print 'can not find the parent folder %s' % _parentPath_s
            return None
        if len(parentNode.sons) == 0:
            newNode = FileNode(_sonFileName_s, None, [], os.path.isdir(_parentPath_s+_sonFileName_s), parentNode)
            if isSameName(parentNode, newNode):
                return
            parentNode.sons.append(newNode)
        else:
            newNode = FileNode(_sonFileName_s, None, [], os.path.isdir(_parentPath_s+_sonFileName_s), parentNode)
            if isSameName(parentNode, newNode):
                return
            parentNode.sons[len(parentNode.sons)-1].bro = newNode
            parentNode.sons.append(newNode)
    
    def isSameName(parentNode, sonNode):
        ''' inputs:
                parentNode -> The parent node.
                sonNode -> the son node.
            outputs:
                If sonNode is already in parentNode.sons then return True.
        '''
        for node in parentNode.sons:
            if node.fileName_s == sonNode.fileName_s:
                print 'has same node %s\\%s -> %s' % (parentNode.fileName_s, node.fileName_s, sonNode.fileName_s)
                return True
        return False
    
    def addNodeUnderPathRecur(root, _path_s):
        ''' inputs:
                root -> The root of directory.
                _path_s -> The absolute path wanted to be added. Examples: 'D:\\CS_DATA\\'
            outputs:
                1. Add all the file nodes under _path_s recursively. 
                2. The _path_s must exist in root.
            Unsafe:
                1. Some system directory can not be added recursively. Examples: 'D:\\System Volume Information'
                2. I do not make the judgment between files whether have same name when adding.
                3. So, this function must use in the premise of operation system ensuring the rule for us.
        '''
        if _path_s[-1] != '\\':
            _path_s = _path_s + '\\'
        
        fileStructure = _path_s.split('\\')
        if fileStructure[0] == root.fileName_s and len(fileStructure) == 2:
            print '_path_s can not be the root'
            return
        
        returnNode = currentNode = searchNodeFromGivenFilePath(root, _path_s)
        if currentNode == None:
            print 'can not find the path'
            return
        queue = deque([])
        fileName_sl = os.listdir(_path_s)
        for fileName_s in fileName_sl:
            file_s = _path_s + fileName_s
            newNode = FileNode(fileName_s, None, [], os.path.isdir(file_s), currentNode)
            queue.append(newNode)
        while(len(queue) != 0):
            newNode = queue.popleft()
            currentNode = newNode.parent
            lenOfSonsCurrentNode = len(currentNode.sons)
            if lenOfSonsCurrentNode == 0:
                currentNode.sons.append(newNode)
            else:
                currentNode.sons[lenOfSonsCurrentNode-1].bro = newNode
                currentNode.sons.append(newNode)
            
            if newNode.isDir_b == True:
                fullPathOfNewNode = getFullPathOfNode(newNode)
                subFileName_sl = os.listdir(fullPathOfNewNode)
                for subFileName_s in subFileName_sl:
                    subNewNode = FileNode(subFileName_s, None, [], os.path.isdir(fullPathOfNewNode+subFileName_s), newNode)
                    queue.append(subNewNode)
        return returnNode       
     
    def printBrosOfGivenNode(root, _path_s):
        ''' inputs:
                root -> The root of the directory.
                _path_s -> Examples: 'D:\\CS_DATA' , 'D:\\CS_DATA\\'
            outputs:
                print out the bros of 'CS_DATA' for 'D:\\CS_DATA'
                print out the sons of 'CS_DATA' for 'D:\\CS_DATA\\'
        '''
        if _path_s[-1] != '\\':
            node = searchNodeFromGivenFilePath(root, _path_s)
            if node == None:
                print 'can not find the node'
            parentOfNode = node.parent
            headOfSons = parentOfNode.sons[0]
            printStr = headOfSons.fileName_s + ','
            while(headOfSons.bro != None):
                headOfSons = headOfSons.bro
                printStr = printStr + headOfSons.fileName_s + ','
        else:
            node = searchNodeFromGivenFilePath(root, _path_s)
            if node == None:
                print 'can not find the node'
            printStr = ''
            if len(node.sons) == 0:
                print 'its sons is empty'
            else:
                for son in node.sons:
                    printStr = printStr + son.fileName_s + ','
        print printStr[:-1]
    
    def crtFileTreeFromPath(_path_s):
        ''' inputs:
                _path_s -> Examples: 'D:\\sketchDataset\\' 
            outputs:
                This function will create the root node by 'D:',
                and then, call addNodeUnderPathUnrecur to add files under 'D:\\',
                and then, again call addNodeUnderPathUnrecur to add files under 'D:\\sketchDataset\\'
                This process is a loop until the last separator of _path_s.
        '''
        if _path_s[-1] != '\\':
            _path_s += '\\'
        fileStructure = _path_s.split('\\')
        lenOfFileStructure = len(fileStructure)
        root = FileNode(_fileName_s=fileStructure[0], _isDir_b=os.path.isdir(fileStructure[0]))
        
        fileStr = root.fileName_s + '\\'
        addNodeUnderPathUnrecur(root, fileStr)
        for i in range(1, lenOfFileStructure-1):
            file_s = fileStructure[i]
            fileStr = fileStr + file_s + '\\'
            addNodeUnderPathUnrecur(root, fileStr)
        return root
    
    def searchLeafNodeUnderGivenNode(root, _path_s):
        ''' inputs:
                root -> For the given directory tree.
                _path_s -> The absolute path of node that wanted to search all the leafs under it.
            outputs:
                Return all the leafs under the given _path_s.
                Leaf is the file whose has not sons and it is not a directory
        '''
        node = searchNodeFromGivenFilePath(root, _path_s)
        leafs = []
        if node == None:
            print 'can not find the node in searchLeafNodeUnderGivenNode'
            return
        queue = deque([])
        queue.append(node)
        while(len(queue) != 0):
            currentNode = queue.popleft()
            if len(currentNode.sons) == 0 and (currentNode.isDir_b == False):
                leafs.append(currentNode)
            else:
                for son in currentNode.sons:
                    queue.append(son)
        return leafs        
    
    def getFullPathOfNode(givenNode):
        ''' 
            find the full(absolute) path of the input node.
        '''
        tmpNode = givenNode
        fullPathOfNode = tmpNode.fileName_s + '\\'
        while(tmpNode.parent != None):
            tmpNode = tmpNode.parent
            fullPathOfNode = tmpNode.fileName_s + '\\' + fullPathOfNode
        return fullPathOfNode
    

     比如我要计算草图检索的验证集,可以上上面的代码后面添加代码:

    if __name__ == '__main__':
        root = crtFileTreeFromPath('D:\\sketchDataset\\')
        categroyNode = addNodeUnderPathRecur(root, 'D:\\sketchDataset\\category\\')
        leafs = searchLeafNodeUnderGivenNode(root, 'D:\\sketchDataset\\category\\')
        containModel_t = {}
        for i in range(len(leafs)):
            if leafs[i].parent.fileName_s not in containModel_t:
                containModel_t[leafs[i].parent.fileName_s] = []
                containModel_t[leafs[i].parent.fileName_s].append(strExt.extractModelIdWithSuffix(leafs[i].fileName_s, suffix_s='.off'))
            else:
                containModel_t[leafs[i].parent.fileName_s].append(strExt.extractModelIdWithSuffix(leafs[i].fileName_s, suffix_s='.off'))
        categroyNode = addNodeUnderPathRecur(root, 'D:\\sketchDataset\\all_categorized_sketches\\')
        sketchToCate_t = {}
        for son in categroyNode.sons:
            sketchNodes = son.sons
            for sketchNode in sketchNodes:
                sketchName = strExt.extractSketchNameWithSuffix(sketchNode.fileName_s, suffix_s='.txt')
                if sketchName not in sketchToCate_t:
                    sketchToCate_t[sketchName] = son.fileName_s
         
        wanted = tblConcat.concatTableByKey_ValAndVal_Vals(sketchToCate_t, containModel_t)
        print wanted

     结果就是,也就是草图165号的验证模型是'm1646.off, m1647.off'等等。

    {'s165.txt': ['m1646.off', 'm1647.off', 'm1648.off', 'm1649.off', 'm1650.off', 'm1651.off', 'm1652.off', 'm1653.off', 'm1654.off', 'm1655.off', 'm1656.off', 'm1657.off', 'm1658.off', 'm1659.off', 'm1660.off', 'm1661.off', 'm1662.off', 'm1663.off', 'm1664.off', 'm1665.off'] ......}
    

     

    展开全文
  • 这一次问题难点在于词性分类,本文将以此题为例,介绍如何使用结巴分词对中文词语词性进行分类。 0.包选取 中文分词必不可少包:jieba library(jiebaR) library(jiebaRD)#用于分词 作图包我们选择 library...

    以下内容仅为学习笔记,如表述有误,欢迎批评指正。
    这一次的作业是基于本人3月24日内容的进一步处理,老师布置的题目为
    题目
    这一次问题的难点在于词性分类,本文将以此题为例,介绍如何使用结巴分词对中文词语词性进行分类。

    0.包的选取

    中文分词必不可少的包:jieba

    library(jiebaR)
    library(jiebaRD)#用于分词
    

    作图包我们选择

    library(ggplot2)#用于作图
    

    读取数据可以不额外导入包,使用基础的read.csv函数,但是这样读取效果很慢,建议采用read_csv函数,这一点在我的上一篇笔记中提到过

    这个函数时读csv文件时能够把所有character型的变量读成factor型,读取大数据的时候效率更高

    类似的函数还有data.table包的fread()函数,这两个函数的异同可以在dingdingxia前辈的博文中阅读

    说回read_csv函数,这个函数需要

    library(readr)#用于读取数据
    

    此外还需要

    library(tidyverse)#enframe函数需要用到
    library(dplyr)#用于使用过滤函数filter()
    

    这两个包的使用将在下文提及

    1.数据读入

    # 工作路径
    setwd("D://1Study//R//CH05")
    getwd()
    
    # 读入数据
    data_titles = read_csv("train_data.csv",col_names = T)
    #col_names = T也就是.csv方法中的header=T
    data_titles
    
    #另存数据
    question_titles = data.frame(data_titles[,2])#另存为数据,只保留标题一栏,使不破坏原数据
    

    当然,col_names默认赋值就是T,不写也可以

    2.中文分词与词性标注

    seg <- worker('tag')#构筑词性标注环境
    
    seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。
    
    seg_question#显示标题中所有的词语及其词性,这一过程需要耗时15str(seg_question)#查看数据类型
    
    title_table <- enframe(seg_question)
    
    title_table
    

    要提取词性,(1)需要构筑词性标注环境
    前一篇笔记中提到过engine = worker(stop_word = "stopwordsC.txt")可以在构筑环境的时候使用停用词,这里的seg <- worker('tag')原理也差不多,就是构筑词性标注环境,并且这里不需要去除停用词,因为形容词不是停用词
    (2)需要用segment函数套用前面定义的环境对标题进行分词

    seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。
    

    如果用

    seg_question = tagging(question_titles$question_title,seg)`
    

    也是可以的

    无论是哪种格式,这里得到的seg_question实质上是一个带属性的向量,这样其实不是特别好用。

    因此要把它变成数据框的格式,方便以后利用
    这里使用enframe()

    title_table <- enframe(seg_question)
    

    这是tidyverse包下的一个函数,作用是将数据存储为tibble数据框,转换为具有名称和值的数据框
    在这里插入图片描述
    如果用前一节课的questionFreq = as.data.frame(table(seg_question))普通的数据框只能生成频数表,得不到词性
    这一方法借鉴了黄天元前辈的博文R语言自然语言处理:词性标注与命名实体识别

    3.筛选形容词,过滤所有非形容词

    #write.csv(title_table,file = "title_table.csv",row.names = TRUE)
    #另存为表格,这一过程在我的电脑上需要耗时10秒
    adj_question <- filter(.data=title_table,name == "a")
    adj_question
    

    filter函数隶属于dplyr包,关于这一函数的使用方法可以参考LEEBELOVED前辈的博文R语言dplyr包:高效数据处理函数(filter、group_by、mutate、summarise)

    4.构筑频数表

    后续步骤与前一篇笔记的步骤较为类似,在此不再进行详细记录理解。

    adj = data.frame(adj_question[,2])#把所有形容词另存为数据,使不破坏原数据
    adj
    adjFreq = as.data.frame(table(adj))#生成频数表
    
    #过滤出现次数过少的形容词,这一步骤可以省略
    adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,2]))<2),]
    
    adjFreq = adjFreq[order(-adjFreq$Freq),]#排序
    
    data = adjFreq[1:100,]#提取问题标题的频繁词前100个形容词
    

    5.绘图

    依据前一步得到的频数表
    在这里插入图片描述
    绘图

    # 对柱子的顺序进行重新排列
    data$adj = factor(data$adj,levels = data$adj)
    
    ggplot(data,aes(x=adj,y=Freq))+
      geom_bar(stat="identity")+
      theme(axis.text.x = element_text(angle = 60,hjust = 1))+
      xlab("形容词")+
      ylab("频数")+
      labs(title = '问题标题的频繁词前100个形容词')
    

    最后附上完整代码及结果柱状图

    ######
    #根据知乎问题标签预测数据训练集(train_data.csv)
    #提取问题标题的频繁词前100个形容词
    library(jiebaR)
    library(jiebaRD)#用于分词
    library(ggplot2)#用于作图
    library(readr)#用于读取数据
    #install.packages("tidyverse")
    library(tidyverse)#enframe函数需要用到
    library(dplyr)#用于使用过滤函数filter()
    #####
    #1.数据导入
    #####
    
    # 工作路径
    setwd("D://1Study//R//CH05")
    getwd()
    
    # 读入数据
    data_titles = read_csv("train_data.csv") #read_csv读取大数据的时候效率更高
    data_titles
    
    #另存数据
    question_titles = data.frame(data_titles[,2])#另存为数据,只保留标题一栏,使不破坏原数据
    
    #####
    #2.中文分词与词性标注
    #####
    seg <- worker('tag')#构筑词性标注环境
    #这里不需要去除停用词,因为形容词不是停用词
    seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。
    
    seg_question#显示标题中所有的词语及其词性,这一过程需要耗时15str(seg_question)#查看数据类型
    #这里得到的seg_question实质上是一个带属性的向量,这样其实不是特别好用。
    #因此我要把它变成数据框的格式,方便以后利用。
    
    title_table <- enframe(seg_question)
    #将上述数据存储为tibble数据框,转换为具有名称和值的数据框
    #如果用前一节课的questionFreq = as.data.frame(table(seg_question))普通的数据框只能生成频数表,得不到词性
    
    title_table
    
    #####
    #3.筛选形容词,过滤所有非形容词
    ######
    #write.csv(title_table,file = "title_table.csv",row.names = TRUE)#另存为表格,这一过程需要耗时10秒
    adj_question <- filter(.data=title_table,name == "a")
    adj_question
    
    #4.构筑频数表
    ######
    adj = data.frame(adj_question[,2])#把所有形容词另存为数据,使不破坏原数据
    adj
    adjFreq = as.data.frame(table(adj))#生成频数表
    
    #过滤出现次数过少的形容词,这一步骤可以省略
    adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,2]))<2),]
    
    adjFreq = adjFreq[order(-adjFreq$Freq),]#排序
    
    data = adjFreq[1:100,]#提取问题标题的频繁词前100个形容词
    
    #####
    #5.绘图
    ######
    # 对柱子的顺序进行重新排列
    data$adj = factor(data$adj,levels = data$adj)
    
    ggplot(data,aes(x=adj,y=Freq))+
      geom_bar(stat="identity")+
      theme(axis.text.x = element_text(angle = 60,hjust = 1))+
      xlab("形容词")+
      ylab("频数")+
      labs(title = '问题标题的频繁词前100个形容词')
    

    在这里插入图片描述
    以上内容为我对R语言结巴分词与词性提取的理解以及“提取知乎问题标题的频繁词前100个形容词”的实战,若理解有误,欢迎批评指正。
    如果直接运行本文上方代码得到的图会与上图不符,会得到3月29日上午修正中的图,具体原因请见3月29日下午的修正,感谢@MahoChan 同学的批评指正。
    ------------------3月26日修正----------------------------
    原注释有误,应该是过滤出现次数过少的形容词,而不是过滤关键词的最短长度,这一步可有可无,这是加了能让后面排序的计算快一些。
    感谢同学提醒。
    3月26日前原内容为
    在这里插入图片描述
    现更改为
    在这里插入图片描述
    ------------------3月29日上午修正----------------------------
    有同学反馈,说用的是和本人一样的代码,但是运行出来的图不一样,今天本人再次运行了原代码,发现得到的图如下
    在这里插入图片描述
    是的!和同学反馈的情况一致!
    为什么一样的代码在不同的时候生成的结果会不一样呢!
    本人猜测是因为jiebaR包或jiebaRD包在3月28日左右更新了,所以会产生不一样的分词效果,在确认原因后会对本文进行新的补充。

    ------------------3月29日下午修正----------------------------
    本人上午的猜想是错误的,感谢@MahoChan的指正!由下图结果可以发现,这两个包都是我在3月3日装的,是最新的版本,此期间也没有更新过。

    注:下图内容使用函数library(help="jiebaR")即可查看
    在这里插入图片描述
    在这里插入图片描述
    那么为什么会出现得到不同结果的两幅图呢?
    正如@MahoChan同学所说

    25日写字长小于2的时候过滤掉了单字,然而变量在环境中没清除,用这样数据画出来就没有单字

    25号我运行了代码

    # 过滤关键词的最短长度
    adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,1]))<2),]
    

    过滤了第一列,并且把结果保存进了环境变量中,所以所有一个字的形容词都被过滤掉了

    如果想要得到我原文中的结果图,完整的代码应该是

    ######
    #根据知乎问题标签预测数据训练集(train_data.csv)
    #提取问题标题的频繁词前100个形容词
    library(jiebaR)
    library(jiebaRD)#用于分词
    library(ggplot2)#用于作图
    library(readr)#用于读取数据
    #install.packages("tidyverse")
    library(tidyverse)#enframe函数需要用到
    library(dplyr)#用于使用过滤函数filter()
    #####
    #1.数据导入
    #####
    
    # 工作路径
    setwd("D://1Study//R//CH05")
    getwd()
    
    # 读入数据
    data_titles = read_csv("train_data.csv") #read_csv读取大数据的时候效率更高
    data_titles
    
    #另存数据
    question_titles = data.frame(data_titles[,2])#另存为数据,只保留标题一栏,使不破坏原数据
    
    #####
    #2.中文分词与词性标注
    #####
    seg <- worker('tag')#构筑词性标注环境
    #这里不需要去除停用词,因为形容词不是停用词
    seg_question = segment(question_titles$question_title,seg) # 对所有的标题进行中文分词。
    
    seg_question#显示标题中所有的词语及其词性,这一过程需要耗时15str(seg_question)#查看数据类型
    #这里得到的seg_question实质上是一个带属性的向量,这样其实不是特别好用。
    #因此我要把它变成数据框的格式,方便以后利用。
    
    title_table <- enframe(seg_question)
    #将上述数据存储为tibble数据框,转换为具有名称和值的数据框
    #如果用前一节课的questionFreq = as.data.frame(table(seg_question))普通的数据框只能生成频数表,得不到词性
    
    title_table
    
    #####
    #3.筛选形容词,过滤所有非形容词
    ######
    #write.csv(title_table,file = "title_table.csv",row.names = TRUE)#另存为表格,这一过程需要耗时10秒
    adj_question <- filter(.data=title_table,name == "a")
    adj_question
    
    #4.构筑频数表
    ######
    adj = data.frame(adj_question[,2])#把所有形容词另存为数据,使不破坏原数据
    adj
    adjFreq = as.data.frame(table(adj))#生成频数表
    
    # 过滤关键词的最短长度
    adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,1]))<2),]
    
    # 过滤出现次数最少的形容词,这一步可以不写,目的是加快排序
    adjFreq = adjFreq[-which(nchar(as.character(adjFreq[,2]))<2),]
    
    adjFreq = adjFreq[order(-adjFreq$Freq),]#排序
    
    data = adjFreq[1:100,]#提取问题标题的频繁词前100个形容词
    
    #####
    #5.绘图
    ######
    # 对柱子的顺序进行重新排列
    data$adj = factor(data$adj,levels = data$adj)
    
    ggplot(data,aes(x=adj,y=Freq))+
      geom_bar(stat="identity")+
      theme(axis.text.x = element_text(angle = 60,hjust = 1))+
      xlab("形容词")+
      ylab("频数")+
      labs(title = '问题标题的频繁词前100个形容词')
    
    展开全文
  • 数据挖掘 文本分类(五)

    千次阅读 2014-12-21 21:33:16
     首先是取名词,我们要把名词取出来,是因为一篇文档,名词最能够代表这一篇文档属于哪一类的,其他的形容词,副词之类的词语并不能很好的代表某一类文档。所以要取名词,这个当然是用正则表达式了。  我们看...
  • 首先对网络新闻评论数据的特点进行归纳总结,选取不同的特征集、特征维度、权重计算方法和词性等因素进行分类测试,并对实验结果进行分析比较。对比结果表明:情感词和论据词语搭配效果优于仅使用情感词作为评论特征...
  • 浅谈python迭代器

    2019-04-11 08:58:42
    其实我觉得两者之间不能用区别这个词语形容,我认为更多是继承拓展关系 我们说下迭代器: 迭代器是访问集合内元素一种方式,一般用来遍历数据,for循环就是一种方式 迭代器和用下标访问列表元素方式不一样...
  • 制造业CIO会向COO演变吗?

    千次阅读 2012-10-17 13:41:05
    中国制造业三大评价指标数据,即大宗商品数据上生意社发布大宗商品供需指数(BCI)、国家统计局和中国物流采购联合会联合...然而在IT界,对于制造业判断总或是用保守、粗犷等词语形容,这或是雾里看花造成
  • 从简单的数据来看,王者荣耀已经拥有超过2亿注册用户,每日活跃用户超过5000万,仅一个月就吸金30亿……风头一时无两,话题性甚至超过了当年全民抢红包时盛况,这种火爆已经不是能够轻易用词语形容的了,不管...
  • 中文自然语言处理 获取语料:语言材料,文本集合。 语料预处理: 1.数据清洗:整理出感兴趣内容 2.分词:将文本全部进行分词,基于字符串匹配,统计分词方法,规则...2.词向量 :将字、词语转换成向量矩阵计...
  • 学期末总结——我体会翻转课堂

    千次阅读 2015-12-18 08:33:58
     一个学期了,现在我还能记得在第一节《数据结构》课上,贺老师饱含热情的向我们介绍“翻转课堂”,听得我们也是热血沸腾,这种感觉用个不太恰当但是很贴切的词语形容——“洗脑”。当然并不是真的
  • 对于移动游戏方面的数据,用一个词语概括,那就是难以置信。我们或许时不时在生活中用到“革命”这个词汇,不过,现在用“革命”这个词形容移动游戏和之前人们对移动游戏看法相比,这实在是不公平。 我们需要...
  • 词汇选项算法分享

    2013-08-18 13:09:00
    有1万多个词语,任意抽取1个词语,通过程序智能抽取三个与该...2、通过工具或者数据自带的话,得到每个词语的词性(动词,形容词,还是名词等) 3、获取混淆项时,先通过Soundex 筛选出读音类似的词语,然后通过词...
  • NLP一般流程小记

    2020-07-20 17:22:47
    NLP一般流程小记 1.获取语料 语料,是NLP任务所研究内容,通常用一个文本集合作为语料库(Corpus)来源:已有语料,积累文档, 下载语料 2. 语料预处理 ...3) 词性标注:给词语打词类标签,如形容
  • 1.xml和json的区别,请用四个词语形容 JSON相对于XML来讲,数据的体积小,传递的速度更快些 ·JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互 ·XML对数据描述性比较好; ·JSON的速度要远远快...
  • 大数据有大发展

    2021-03-19 14:44:40
    近几年,我们不乏听到关于大数据行业各大报道,它发展速度可谓用飞速来形容,绵延万里,滔滔不绝,甚至在各行各业都能听到这个词语的出现,它早已成功霸占了各大媒体头条。那它为何会有如此火爆,今天一起来...
  • 技术面 C++

    2020-08-01 09:15:33
    技术面 自我介绍 介绍简历中某一个项目 计算机网络有几层(传输层有哪些协议) ...用几个词语形容性格 对待加班看法 如何释放压力 项目合作中如何合作 项目合作中遇到困难是什么 如果项目组成员
  • 前几年有个数据,上海1000多万外来人口差不多每四个就有一个安徽人,别说上海了,六朝古都的南京因为他隔壁...一个地方的人口在另一个地方居多,就会引起轰动,而一些排外的魔都土著会用一个恶心的词语形容外来人口.
  • Nuance研究主管 Nils Lenke 展示数据显示,在将深度神经网络算法成功纳入语音识别系统后,单词错误率从 2010 年左右开始急剧下降,每年降低约 18%。 语音识别主要是分析句子、句法(名词、动词、形容词、副词等)...
  • u盘文件不显示却占空间

    千次阅读 2019-06-05 16:15:00
    当时各种词语无法形容心情。 会议结束之后,仔细看了一下,我文件没有了,但是空间还被占用。网上搜索了一番,终于恢复了数据。 u盘文件不显示却占空间 盘文件突然消失不见,不是...
  • 导出两个字典数据的差异 导入差异数据到一个字典 导出成 StarDict(星际译王)的原格式(用于 DictEditor 生成字典) 导出成 mdict 的 .mdx 的源文件(用于 MdxBuilder 生成 mdx 字典) 词典格式 .csv, .db (Sqlite)...
  •  每一个词语都是直达问题,换言之,没有废话  几乎什么都可作为(挂定为)一个值,一个表达式,例如:线程语句,流程语句,过程定义语句,类定义语句........  过程内程序区内变量默认可以访问外来变量,使代码...
  • 在分词数据的基础上,每个单词以“/type”的形式标记其词性或实体类别。值得注意的是,词法分析的训练目前仅支持标签体系与我们一致的数据。后续也会开放支持新的标签体系,敬请期待。 LAC/nz 是/v 个/q 优秀/a ...
  • 【速记信息】在听时候要快速记笔记,可以在选择项旁尽可能记下文中所提及人名、地名、各种数据、事实和理由等你认为重要信息。好笔记应是对所听内容作出简要提纲,可以用关键词,也可以用一些自己常用...
  • filt 默认False, 是否使用过滤器去除一些没有意义的词语,例如“可以”。 model_path 设置模型文件所在文件夹,默认为models/ deli 默认为‘_’, 设置词与词性之间的分隔符  rm_space 默认为False,...
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。 paddle模式,利用PaddlePaddle深度学习...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

形容数据的词语