精华内容
下载资源
问答
  • 三种编程命名规则:驼峰命名法,帕斯卡命名法,匈牙利命名
    千次阅读
    2018-12-07 22:48:13


    三种流行的命名法则

    目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。

    驼峰命令法(Camel)

    也称骆驼式命名法正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:

    printEmployeePaychecks()print_employee_paychecks()

    第一个函数名使用了骆驼式命名法,函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法,函数名中的每一个逻辑断点都有一个下划线来标记

    骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍

    驼峰式命名法分为大驼峰式命名规则:FirstName, CamelCase

    小驼峰式命名规则:firstName, camelCase

    [中间不需要空格 - _等分割符]

    匈牙利命名法(Hungarian)

    广泛应用于象Microsoft Windows这样的环境中Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯- 西蒙尼(Charles Simonyi) 提出的

    匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等这些符号可以多个同时使用,顺序是先m_(成员变量), 再指针,再简单数据类型,再其它

    例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量

    匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途

    匈牙利命名法的规则是:

    属性+类型+描述
    属性一般是小写字母+:
    g
    :全局变量
    m_:类成员变量
    s_:静态变量
    c_:常量
    类型就多了:
    b:bool
    sz:以零结束的字符串
    p:指针
    n:整整
    dw:双字
    l:长整型
    无符号:u
    函数:fn

    匈牙利命名法分为系统和应用两种。系统着眼于类型。应用着眼于语义,比如col表示行,c表示计数。

    帕斯卡(Pascal)命名法

    与骆驼命名法类似只不过骆驼命名法是首字母小写,而帕斯卡命名法是首字母大写,如:

    DisplayInfo(); 
    string UserName;
    

    pascal命名规则:大驼峰式命名规则

    命名的基本原则

    (1)标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解——尽量采用采用英文单词或全部中文全拼表示,若出现英文单词和中文混合定义时,使用连字符“_”将英文与中文割开。较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。例如:temp->tmp、flag->标志寄存器、statistic->stat、increment->inc、message->msg等缩写能够被大家基本认可。
    (2)命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。
    (3)自己特有的命名风格,要自始至终保持一致,不可来回变化。个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。
    (4)对于变量命名,禁止取单个字符(如i 、j 、k… ),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i 、j 、k 作局部循环变量是允许的。变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。
    (5)除非必要,不要用数字或较奇怪的字符来定义标识符。
    (6)命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。
    (7)在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。对接口部分的标识符应该有更严格限制,防止冲突。如可规定接口部分的变量与常量之前加上“模块”标识等。
    (8)用正确的反义词组命名具有互斥意义的变量或相**作的函数等。

    下面是一些在软件中常用的反义词组:

    add / remove begin / end create / destroy
    insert / delete first / last g et / release
    increment / decrement put / get
    add / delete lock / unlock open / close
    min / max old / new start / stop
    next / previous source / target show / hide
    send / receive source / destination
    cut / paste up / down
    示例:
    intmin_sum;
    intmax_sum;
    intadd_user( BYTE *user_name );
    intdelete_user( BYTE *user_name );

    (9)除了编译开关/ 头文件等特殊应用,应避免使用_EXAMPLE_TEST_ 之类以下划线开始和结尾的定义。

    变量名的命名规则

    (1)变量的命名规则要求用“匈牙利法则”。
    即开头字母用变量的类型,其余部分用变量的英文意思、英文的缩写、中文全拼或中文全拼的缩写,要求单词的第一个字母应大写。
    即: 变量名=变量类型+变量的英文意思(或英文缩写、中文全拼、中文全拼缩写)
    对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
    见下表:

    类型首字母例子
    bool用b开头b标志寄存器
    int用i开头iCount
    short int用n开头nStepCount
    long int用l开头lSum
    char用c开头cCount
    unsigned char用by开头
    float用f开头fAvg
    double用d开头dDeta
    unsigned int(WORD)用w开头wCount
    unsigned long int(DWORD)用dw开头dwBroad
    字符串用s开头sFileName
    用0结尾的字符串用sz开头szFileName

    (2)指针变量命名的基本原则为:

    对一重指针变量的基本原则为:“p”+变量类型前缀+命名,如一个float*型应该表示为pfStat。对二重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。
    (3)全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount。即:变量名=g_+变量类型+变量的英文意思(或缩写)。此规则还可避免局部变量和全局变量同名而引起的问题。
    (4)静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst。即: 变量名=s_+变量类型+变量的英文意思(或缩写)
    (5)对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。并且要求用大写。如:

    enum cmEMDAYS
    {
    EMDAYS_MONDAY;
    EMDAYS_TUESDAY;
    ……
    };
    

    (6)对struct、union变量的命名要求定义的类型用大写。并要加上前缀,其内部变量的命名规则与变量命名规则一致。
    结构一般用S开头,如:

    struct ScmNPoint
    {
    int nX;//点的X位置
    int nY; //点的Y位置
    };
    

    联合体一般用U开头,如:

    union UcmLPoint
    {
    LONG lX;
    LONG lY;
    }
    

    (7)对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。当需要由多个单词表示时,单词与单词之间必须采用连字符“_”连接。

    如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示类别。

    (8)对const 的变量要求在变量的命名规则前加入c_。即:c_+变量命名规则;示例:const char* c_szFileName;

    函数的命名规范

    (1)函数的命名应该尽量用英文(或英文缩写、中文全拼、中文全拼缩写)表达出函数完成的功能——函数名应准确描述函数的功能。遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。函数名首字大写,若包含有两个单词的每个单词首字母大写。如果是OOP 方法,可以只有动词(名词是对象本身)。示例:

    LONG GetDeviceCount(……);
    void print_record( unsigned int rec_ind ) ;
    intinput_record( void ) ;
    unsigned char get_current_color( void ) ;
    

    (2)避免使用无意义或含义不清的动词为函数命名。如使用process、handle等为函数命名,因为这些动词并没有说明要具体做什么。

    (3)必须使用函数原型声明。函数原型声明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名;内部函数,只要注释其定义文件名——和调用者在同一文件中(简单程序)时不需要注释。
    应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。

    函数参数命名规范

    (1)参数名称的命名参照变量命名规范。
    (2)为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。
    (3)为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const标志。

    如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)

    文件名(包括动态库、组件、控件、工程文件等)的命名规范文件名的命名要求表达出文件的内容,要求文件名的长度不得少于5个字母,严禁使用象file1,myfile之类的文件名。

    [转][三种编程命名规则:驼峰命名法,帕斯卡命名法,匈牙利命名法](https://www.cnblogs.com/Offie/p/5021368.html)

    更多相关内容
  • C#类与命名空间

    千次阅读 2021-08-18 23:15:26
    当你对类和命名空间有了初步的认识,你可能就对类和命名空间放置在那有疑问,不必疑惑,它们是放在类库里,类库、顾名思义就是类的仓库了,本篇文章也会介绍如何对项目添加类库的引用,类与类之间一旦互相引用了,...

    前言

    本文章包括这样几个类容,首先是剖析Hello World程序,上篇文章分别用十种技术编写了Hello World程序,其中有简单的也有复杂的,本片文章将剖析其中最简单的,也就是ConsoleApplication,通过剖析这个程序,来让大家对类和命名空间有一个初步的认识,当你对类和命名空间有了初步的认识,你可能就对类和命名空间放置在那有疑问,不必疑惑,它们是放在类库里,类库、顾名思义就是类的仓库了,本篇文章也会介绍如何对项目添加类库的引用,类与类之间一旦互相引用了,它们之间就产生了依赖关系,这个依赖关系在软件质量当中,起着至关重要的作用,因为质量好的软件和质量不好的软件他们之间非常明显的区别就在于依赖关系处理的怎么样,质量好的软件,它的依赖关系一定是非常清晰、好维护的,质量不好的软件,往往都是因为依赖关系不清楚照成的。
    那么,请看正篇吧

    剖析Hello World程序

    类(class)构成程序的主体

    类 (class) 是最基础的 C#
    类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例 (instance)
    提供了定义,实例也称为对象 (object)。类支持继承 (inheritance) 和多态性 (polymorphism),这是派生类
    (derived class) 可用来扩展和专用化基类 (base class) 的机制。

    上面的文章摘抄自C#语言定义文档,从上面可以看出,C#语言定义文档为了让我们理解类这样一个名词,它后面用了二十个更加摸不着头脑的名词,所以如果我们直接看官方的文档,可能大家会什么都学不到,而且很可能觉得难,就干脆放弃了,前面说过学习应该是由浅入深,由表及里,所以我们不用上面的解释来理解类,当然上面的描述其实很精辟,但是不适合初学者,它更适合的是已经入门了C#的人来看

    至于我们该怎么理解类?初学者只需要记住,类是构成程序的主体,其它的,入门后再说

    名称空间(namespace)以树形结构组织类(和其它类型)

    什么是命名空间呢?比如说我们有一千个类,当你想使用其中一个类的时候,你会发现找起来很麻烦,就好比我们有一千本书,当我们需要看其中一本的时候,你要找就必须一本一本的去找,直到找到这本书为止,非常麻烦。
    名称空间呢就是用来把类当然还有其它的一些类型,用良好的结构组织在一起,这样的一个作用,就好比下面的这个图书馆,图书馆里边的书不是随便放的,他是按照一定逻辑分门别类放置,如果你想找一本书的话,你就看看这本书属于哪一类第几本,就能很轻易的在一堆书山中找到你想找到的书,而且我们在非常多的书的情况下,有些书是同名的,但这些书名字虽然一样,却属于不同的学科,所以说命名空间也能有效的避免同名的类之间命名的冲突
    图书馆的书

    通过一个简单的程序来理解类和命名空间

    光说不练假把式,我们还是通过一个控制台应用程序来理解命名空间和类吧
    在这里插入图片描述
    类在C#程序中,高亮的颜色是水蓝色,比如上面图片上显示的Program,和Console这些都是类的名字,

    这两个类Program这个类是我们自己编写的,这个类就代表着我们写的程序,C#语言是完全面向对象的语言,所以这个程序本身也是一个类,如果你学习过C语言的话你就会知道C语言是没有类的,他的Main方法是不需要包含在类里面的,而C#是完全面向对象的,所以说即便是程序的入口点Main方法也一定得包含在类里面。

    在这下面我们还可以看到Console这个类,Console这个类是微软给我们准备好的,我们可以直接使用其中的方法
    在这里插入图片描述
    简略的认识了一下类之后,咱们再来看一下命名空间,在上图中我们能在引用后面看到一行namespace理解类与命名空间,这句代码的意思是,我们编写的这个Prigram这个类,放在了一个名为“理解类与命名空间“的命名空间里,这个命名空间的名称默认会和我们创建Project的时候的名称是一样的,
      为什么会这样呢?意思是我自己写的类用自己定义的名称空间组织起来,当别人想调用我写的类的时候,他也能很方便的从我写的这个名称空间将类找出来,这是次要的,我们主要要知道的是是代码上面的那一片using
    在这里插入图片描述
    上面那一堆using(引用)的意思是我把名称空间引用到我的程序当中来,这样描述的话可能很不容易理解,那我们上实例

    还记得下面这行代码吗?像控制台打印一行Hello World!
    在这里插入图片描述
    为什么我们能直接使用这个系统为我们写好的类呢?就是因为上面的using,他将包含console这个类的名称空间引入至了我们的程序,
    现在我们将包含Console这个类的名称空间(System)引用注释掉
    在这里插入图片描述

    从图中我们可以看到,当我们将包含Console这个类的命名空间引用注释掉之后,Console这段代码立马就报错了,也不再是水蓝色,而是普通的白色
    我们再看一下他报的什么错
    在这里插入图片描述
    编译器提示你当前上下文不纯在Console,因为我把包含这个类的名称空间给注释掉了,当我再把这个名称空间给解注释了之后,编译器才能从新正确的识别这句代码
    在这里插入图片描述
    那是不是没有using引用名称空间就不能使用哪个名称空间里的类了呢?
    也不是,我们可以直接将名称空间写出来,再点出我们想要使用的它包含的类
    在这里插入图片描述
    但是我们一般不这么写,因为当你需要多次使用这个方法的时候,你就需要每次都打出他的命名空间再点出方法,
    在这里插入图片描述
    这样很繁琐,所以,为了方便,就都是使用using来引入命名空间

    但是还是有一些例外,比如说Path这个方法
    在这里插入图片描述
    我们由上图的代码提示可以知道,Path这个方法来自于System(系统)命名空间下的Windows命名空间下的Shapes(形状)命名空间下的一个类
    光看名字也能大概知道,这是一个系统下的widows里一个画图有关的类,现在不需要知道他能干嘛,只要知道有这么一个类,
    因为在System命名空间下的IO命名空间下也有一个Path类,


    平时如果你只需要单独是使用一个Path类的话没问题,但是当你需要这两个命名空间同时使用,那就会出麻烦了
    因为这个时候你使用的Path编译器不知道你想使用的到底是哪个命名空间下的Path,就会冲突了,
    所以当这种情况下,就需要使用命名空间一个一个点出来你需要使用的类了

    小结

    经过上面的文章,我们已经对类和命名空间有了初步的了解了,那么我们就应该思考一个问题,类和命名空间到底存放在上面地方呢?
    换句话说就是比如说我想看一本书,我知道它在第几排货架上第几列、第几本、书名是什么,但是如果我没有这个图书馆,那我还能找到我要的书吗?那肯定是拿不到的,
    所以这个问题的答案就是,类和命名空间它是放在一个叫做类库的东西里,类库就是类和命名空间的物理基础,如果你没有这个类库的话,你即使是知道这个名称空间和类的话,你也没法用它们,

    类库的引用

    上面我们知道了类库是什么,这里我将展示类库的引用

    我们先来看一个wpf程序,
    在这里插入图片描述
    当我想使用Button这个类的时候可以看到这个类是来自于System这个命名空间的,那我们能在哪里找到这个命名空间的物理呢类库?
    在这里插入图片描述
    我们打开解决方案管理器就可以看到System这个类库,每一个不同类型的项目就是引用了不同的类库,所以说,我们不同的项目模板,实际上就是给我们引用了不同的技术所需要的类库,所以以后当我们在新建其他类型的项目的时候,就应该明白,这些并没有什么神奇的地方,它就是给我们引用了不同的类库,再加载了不同的编辑器而已,下面我将展示一下类库的引用

    DLL引用(黑盒引用)

    NuGet简介

    NuGet 介绍. Nuget是 ASP .NET Gallery 的一员。. NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。. 当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。. 如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。. NuGet能更方便地把一些dll和文件 (如jquery)添加到项目中,而不需要从文件中复制拷贝。.

    1. 特点:无源代码,需要有使用文档;使用.dll后缀的动态链接库。如果库有错误无法修改
    2. 添加类库依赖:项目——依赖项——添加项目引用
      在这里插入图片描述
    • 浏览——选择类库文件地址(后缀为.dll的文件)
      在这里插入图片描述
    • 添加NuGet类库(网上其他人共享的类库文件)
      在这里插入图片描述

    项目引用(白盒引用)

    特点:有源代码
    创建类项目:
    在这里插入图片描述

    • 编写类库
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Tools //命名空间可以修改
    {
        public class Calculator //要使用到的类名
        {
            public static double Add(double a,double b)//类下的静态方法
            {
                return (a + b);
            }
            public static double Sub(double a, double b)
            {
                return (a - b);
            }
        }
    }
    
    • 添加依赖关系

    项目——依赖项——添加项目引用——解决方案——选择刚刚创建好的类项目

    在这里插入图片描述
    -引用依赖类
    5.1 在头部添加名称空间
    using Tools;
    5.2 在需要使用的地方
    类名.静态方法名(参数)

    using System;
    using Tools;
    namespace study
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                double result = Calculator.Add(2.3, 4.5);
                Console.WriteLine(result);
            }
        }
    }
    
    
    

    依赖关系

    类或对象之间的耦合关系
    优秀的程序追求“高内聚,低耦合”

    展开全文
  • Linux的命名空间

    千次阅读 2022-01-17 20:03:13
    命名空间提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面来查看运行系统的全局属性。 一、基本概念 命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。我们创建的每个容器都有自己...

      本文中的代码摘自 Linux内核5.15.13版本。
      命名空间提供了虚拟化的一种轻量级形式,使得我们可以从不同的方面来查看运行系统的全局属性。

    一、基本概念

      命名空间(Linux namespace)是linux内核针对实现容器虚拟化映入的一个特性。我们创建的每个容器都有自己的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间互不影响。
      Linux的命名空间机制提供了一种资源隔离的解决方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。
      传统上,在Linux以及其他衍生的UNIX变体中,许多资源是全局管理的。例如,系统中的所有进程按照惯例是通过PID标识的,这意味着内核必须管理一个全局的PID列表。而且,所有调用者通过uname系统调用返回的系统相关信息(包括系统名称和有关内核的一些信息)都是相同的。用户ID的管理方式类似,即各个用户是通过一个全局唯一的UID号标识。
      全局ID使得内核可以有选择地允许或拒绝某些特权。虽然UID为0的root用户基本上允许做任何事,但其他用户ID则会受到限制。例如UID为n的用户,不允许杀死属于用户m的进程( m≠ n)。但这不能防止用户看到彼此,即用户n可以看到另一个用户m也在计算机上活动。只要用户只能操纵他们自己的进程,这就没什么问题,因为没有理由不允许用户看到其他用户的进程。
      但有些情况下,这种效果可能是不想要的。如果提供Web主机的供应商打算向用户提供Linux计算机的全部访问权限,包括root权限在内。传统上,这需要为每个用户准备一台计算机,代价太高。使用KVM或VMWare提供的虚拟化环境是一种解决问题的方法,但资源分配做得不是非常好。计算机的各个用户都需要一个独立的内核,以及一份完全安装好的配套的用户层应用。
      命名空间提供了一种不同的解决方案,所需资源较少。在虚拟化的系统中,一台物理计算机可以运行多个内核,可能是并行的多个不同的操作系统。而命名空间则只使用一个内核在一台物理计算机上运作,前述的所有全局资源都通过命名空间抽象起来。这使得可以将一组进程放置到容器中,各个容器彼此隔离。隔离可以使容器的成员与其他容器毫无关系。但也可以通过允许容器进行一定的共享,来降低容器之间的分隔。例如,容器可以设置为使用自身的PID集合,但仍然与其他容器共享部分文件系统。

    二、实现

      命名空间的实现需要两个部分:每个子系统的命名空间结构,将此前所有的全局组件包装到命名空间中;将给定进程关联到所属各个命名空间的机制。
      子系统此前的全局属性现在封装到命名空间中,每个进程关联到一个选定的命名空间。每个可以感知命名空间的内核子系统都必须提供一个数据结构,将所有通过命名空间形式提供的对象集中起来。 struct nsproxy用于汇集指向特定于子系统的命名空间包装器的指针。在文件nsproxy.h中有:

    /*
     * A structure to contain pointers to all per-process
     * namespaces - fs (mount), uts, network, sysvipc, etc.
     *
     * The pid namespace is an exception -- it's accessed using
     * task_active_pid_ns.  The pid namespace here is the
     * namespace that children will use.
     *
     * 'count' is the number of tasks holding a reference.
     * The count for each namespace, then, will be the number
     * of nsproxies pointing to it, not the number of tasks.
     *
     * The nsproxy is shared by tasks which share all namespaces.
     * As soon as a single namespace is cloned or unshared, the
     * nsproxy is copied.
     */
    struct nsproxy {
    	atomic_t count;
    	struct uts_namespace *uts_ns;
    	struct ipc_namespace *ipc_ns;
    	struct mnt_namespace *mnt_ns;
    	struct pid_namespace *pid_ns_for_children;
    	struct net 	     *net_ns;
    	struct time_namespace *time_ns;
    	struct time_namespace *time_ns_for_children;
    	struct cgroup_namespace *cgroup_ns;
    };
    

      当前内核的以下范围可以感知到命名空间。
      1、 UTS命名空间包含了运行内核的名称、版本、底层体系结构类型等信息。 UTS是UNIXTimesharing System的简称。
      2、保存在struct ipc_namespace中的所有与进程间通信( IPC)有关的信息。
      3、 已经装载的文件系统的视图,在struct mnt_namespace中给出。
      4、 有关进程ID的信息,由struct pid_namespace提供。
      5、 struct user_namespace保存的用于限制每个用户资源使用的信息。
      6、struct net_ns包含所有网络相关的命名空间参数。
      当我讨论相应的子系统时,会介绍各个命名空间容器的内容。在由于在创建新进程时可使用fork建立一个新的命名空间,因此必须提供控制该行为的适当的标志。每个命名空间都有一个对应的标志,在sched.h文件内:

    #define CLONE_NEWCGROUP		0x02000000	/* New cgroup namespace */
    #define CLONE_NEWUTS		0x04000000	/* New utsname namespace */
    #define CLONE_NEWIPC		0x08000000	/* New ipc namespace */
    #define CLONE_NEWUSER		0x10000000	/* New user namespace */
    #define CLONE_NEWPID		0x20000000	/* New pid namespace */
    #define CLONE_NEWNET		0x40000000	/* New network namespace */
    

      不同类型的命名空间的作用:
      IPC:用于隔离进程间通讯所需的资源( System V IPC, POSIX message queues),PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互
      Network:Network Namespace为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口,IPv4和IPv6协议栈,IP路由表,防火墙规则,sockets等等。一个Network Namespace提供了一份独立的网络环境,就跟一个独立的系统一样。
      Mount:每个进程都存在于一个mount Namespace里面,  mount Namespace为进程提供了一个文件层次视图。如果不设定这个flag,子进程和父进程将共享一个mount Namespace,其后子进程调用mount或umount将会影响到所有该Namespace内的进程。如果子进程在一个独立的mount Namespace里面,就可以调用mount或umount建立一份新的文件层次视图。
      PID::linux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同!进程命名空间是一个父子结构,子空间对于父空间可见。
      User:用于隔离用户
      UTS:用于隔离主机名
      每个进程都关联到自身的命名空间视图,在任务定义的结构体task_struct中有如下定义:

    struct task_struct {
    ...
    /* 命名空间 */
    struct nsproxy *nsproxy;
    ...
    }
    

      因为使用了指针,多个进程可以共享一组子命名空间。这样,修改给定的命名空间,对所有属于该命名空间的进程都是可见的。
      init_nsproxy定义了初始的全局命名空间,其中维护了指向各子系统初始的命名空间对象的指针。在kernel/nsproxy.c文件内有

    struct nsproxy init_nsproxy = {
    	.count			= ATOMIC_INIT(1),
    	.uts_ns			= &init_uts_ns,
    #if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
    	.ipc_ns			= &init_ipc_ns,
    #endif
    	.mnt_ns			= NULL,
    	.pid_ns_for_children	= &init_pid_ns,
    #ifdef CONFIG_NET
    	.net_ns			= &init_net,
    #endif
    #ifdef CONFIG_CGROUPS
    	.cgroup_ns		= &init_cgroup_ns,
    #endif
    #ifdef CONFIG_TIME_NS
    	.time_ns		= &init_time_ns,
    	.time_ns_for_children	= &init_time_ns,
    #endif
    };
    

    三、UTS命名空间

      UTS命名空间几乎不需要特别的处理,因为它只需要简单量,没有层次组织。所有相关信息都汇集到下列结构的一个实例中。在utsname.h文件内:

    struct uts_namespace {
    	struct new_utsname name;
    	struct user_namespace *user_ns;
    	struct ucounts *ucounts;
    	struct ns_common ns;
    } __randomize_layout;
    

      uts_namespace所提供的属性信息本身包含在struct new_utsname中:

    struct oldold_utsname {
    	char sysname[9];
    	char nodename[9];
    	char release[9];
    	char version[9];
    	char machine[9];
    };
    
    #define __NEW_UTS_LEN 64
    
    struct old_utsname {
    	char sysname[65];
    	char nodename[65];
    	char release[65];
    	char version[65];
    	char machine[65];
    };
    
    struct new_utsname {
    	char sysname[__NEW_UTS_LEN + 1];
    	char nodename[__NEW_UTS_LEN + 1];
    	char release[__NEW_UTS_LEN + 1];
    	char version[__NEW_UTS_LEN + 1];
    	char machine[__NEW_UTS_LEN + 1];
    	char domainname[__NEW_UTS_LEN + 1];
    }
    

      各个字符串分别存储了系统的名称( Linux…)、内核发布版本、机器名,等等。使用uname工具可以取得这些属性的当前值,也可以在/proc/sys/kernel/中看到

    z@z-virtual-machine:~$ cat /proc/sys/kernel/ostype
    Linux
    z@z-virtual-machine:~$ cat /proc/sys/kernel/osrelease
    5.3.0-40-generic
    
    

      初始设置保存在init_uts_ns中,在init/version.c文件内:

    struct uts_namespace init_uts_ns = {
    	.ns.count = REFCOUNT_INIT(2),
    	.name = {
    		.sysname	= UTS_SYSNAME,
    		.nodename	= UTS_NODENAME,
    		.release	= UTS_RELEASE,
    		.version	= UTS_VERSION,
    		.machine	= UTS_MACHINE,
    		.domainname	= UTS_DOMAINNAME,
    	},
    	.user_ns = &init_user_ns,
    	.ns.inum = PROC_UTS_INIT_INO,
    #ifdef CONFIG_UTS_NS
    	.ns.ops = &utsns_operations,
    #endif
    };
    
    展开全文
  • 命名实体识别(NER)综述

    万次阅读 多人点赞 2021-07-12 21:42:32
    命名实体识别是自然语言处理中的热点研究方向之一, 目的是识别文本中的命名实体并将其归纳到相应的实体类型中。首先阐述了命名实体识别任务的定义、目标和意义; 然后介绍了命名实体识别研究的发展进程,从最初的...

    本文是中文信息处理课程的期末考核大作业,对于自然语言处理主流任务的调研报告
    ————————————————
    版权声明:本文为CSDN博主「<Running Snail>」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/weixin_45884316/article/details/118684681

    摘要

    命名实体识别是自然语言处理中的热点研究方向之一, 目的是识别文本中的命名实体并将其归纳到相应的实体类型中。首先阐述了命名实体识别任务的定义、目标和意义; 然后介绍了命名实体识别研究的发展进程,从最初的规则和字典方法到传统的统计学习方法再到现在的深度学习方法,不断地将新技术应用到命名实体识别研究中以提高性能; 最后针对评判命名实体识别模型的好坏,总结了常用的若干数据集和常用工具,并给出了未来的研究建议 。

    1. 引言

    ​命名实体识别这个术语首次出现在MUC-6(Message Understanding Conferences),这个会议关注的主要问题是信息抽取(Information Extraction),第六届MUC除了信息抽取评测任务还开设了新评测任务即命名实体识别任务。除此之外,其他相关的评测会议包括CoNLL(Conference on Computational Natural Language Learning)、ACE(Automatic Content Extraction)和IEER(Information Extraction-Entity Recognition Evaluation)等。在MUC-6之前,大家主要是关注人名、地名和组织机构名这三类专业名词的识别。自MUC-6起,后面有很多研究对类别进行了更细致的划分,比如地名被进一步细化为城市、州和国家,也有人将人名进一步细分为政治家、艺人等小类。

    ​ 此外,一些评测还扩大了专业名词的范围,比如CoNLL某年组织的评测中包含了产品名的识别。一些研究也涉及电影名、书名、项目名、研究领域名称、电子邮件地址、电话号码以及生物信息学领域的专有名词(如蛋白质、DNA、RNA等)。甚至有一些工作不限定“实体”的类型,而是将其当做开放域的命名实体识别和分类。

    2. 研究背景

    ​ 命名实体识别(Named Entity Recognition, NER)是NLP中一项非常基础的任务,是信息提取、问答系统、句法分析、机器翻译等众多NLP任务的重要基础工具。命名实体一般指的是文本中具有特定意义或者指代性强的实体,学术上通常包括实体类,时间类,数字类三大类和人名、地名、组织机构名、时间、日期、货币、百分比七小类。NER就是从非结构化的输入文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体。
    ​ NER是一个具有挑战性的学习问题,在大多数语言和领域中,只有很少量的训练数据可用,同时对于可以作为名称的单词种类几乎没有限制,因此很难从这种小的数据样本中进行概括。其发展从早期基于词典和规则的方法,到传统机器学习的方法,到近年来基于深度学习的方法。
    ​ NER是NLP中一项基础性关键任务。从自然语言处理的流程来看,NER可以看作词法分析中未登录词识别的一种,是未登录词中数量最多、识别难度最大、对分词效果影响最大问题。同时NER也是关系抽取、事件抽取、知识图谱、机器翻译、问答系统等诸多NLP任务的基础。

    3. 主要方法

    命名实体识别从早期基于词典和规则的方法,到传统机器学习的方法, 后来采用基于深度学习的方法,一直到当下热门的注意力机制、图神经网络等研究方法, 命名实体识别技术路线随着时间在不断发展。

    命名实体识别 NER 的发展史

    3.1 基于规则和字典的方法

    ​ 基于规则的NER系统依赖于人工制定的规则。规则的设计一般基于句法、语法、词汇的模式以及特定领域的知识等。词典是由特征词构成的词典和外部词典共同组成,外部词典指已有的常识词典。 制定好规则和词典后,通常使用匹配的方式对文本进行处理以实现命名实体识别。
    ​ 当字典大小有限时,基于规则的NER系统可以达到很好的效果。由于特定领域的规则以及不完全的字典,这种NER系统的特点是高精确率与低召回率,并且类似的系统难以迁移应用到别的领域中去:基于领域的规则往往不通用,对新的领域而言,需要重新制定规则且不同领域字典不同。所以这种基于规则的方法局限性非常明显,不仅需要消耗巨大的人力劳动,且不容易在其他实体类型或数据集扩展。

    3.2基于传统机器学习的方法

    ​ 在基于机器学习的方法中, 命名实体识别被当作是序列标注问题。与分类问题相比,序列标注问题中当前的预测标签不仅与当前的输入特征相关,还与之前的预测标签相关,即预测标签序列之间是有强相互依赖关系的。
    ​ 采用的传统机器学习方法主要包括:

    • 隐马尔可夫模型(Hidden Markov Model, HMM)
      HMM对转移概率和表现概率直接建模,统计共现概率。更适用于一些对实时性有要求以及像信息检索这样需要处理大量文本的应用,如短文本命名实体识别。
    • 最大熵(Maximum Entropy, ME) [14]
      ME结构紧凑,具有较好的通用性, 其主要缺点是训练时间复杂性非常高,甚至导致训练代价难以承受,另外由于需要明确的归一化计算,导致开销比较大。
    • 最大熵马尔可夫模型(Maximum Entropy Markov Model, MEMM) [15]
      MEMM对转移概率和表现概率建立联合概率,统计条件概率,但由于只在局部做归一化容易陷入局部最优。
    • 支持向量机(Support Vector Machine, SVM)
      SVM在正确率上要比HMM高一些,但是HMM在训练和识别时的速度要快一些。 主要是由于在利用Viterbi算法求解命名实体类别序列的效率较高。
    • 条件随机场( Conditional Random Fields, CRF) [16]等。
      CRF模型统计全局概率,在归一化时考虑数据在全局的分布,而不是仅仅在局部进行归一化, 因此解决了MEMM中标记偏置的问题。 在传统机器学习中, CRF被看作是命名实体识别的主流模型, 优点在于在对一个位置进行标注的过程中CRF可以利用内部及上下文特征信息。 但同时存在收敛速度慢、训练时间长的问题。

    3.3 基于深度学习的方法

    ​ 近年来, 在基于神经网络的结构上加入注意力机制、图神经网络、迁移学习、远监督学习等热门研究技术也是目前的主流研究方向 。NER使用深度学习的原因主要是:1.NER适用于非线性转化。2.深度学习避免大量的人工特征的构建,节省了设计NER功能的大量精力。3.深度学习能通过梯度传播来训练,这样可以构建更复杂的网络。5. 端到端的训练方式。

    3.3.1 BiLSTM-CRF

    在这里插入图片描述

    ​ BiLSTM-CRF直观显示了模型结构与优势,其中BiLSTM通过前向/后向传递的方式学习序列中某字符依赖的过去和将来的信息,CRF则考虑到标注序列的合理性。模型主要由Embedding层(主要有词向量,字向量以及一些额外特征),双向LSTM层,以及最后的CRF层构成。在特征方面,该模型继承了深度学习方法的优势,无需特征工程,使用词向量以及字符向量就可以达到很好的效果,如果有高质量的词典特征,能够进一步获得提高。
    ​ 引入双向LSTM层作为特征提取工具,LSTM拥有较强的长序列特征提取能力。双向LSTM,在提取某个时刻特征时,能够利用该时刻之后的序列的信息,无疑能够提高模型的特征提取能力。引入CRF作为解码工具。中文输入经过双向LSTM层的编码之后,需要能够利用编码到的丰富的信息,将其转化成NER标注序列。通过观察序列,预测隐藏状态序列,CRF无疑是首选。
    ​ 这些优势使得论文模型在当时取得SOTA结果,已经达到或者超过了基于丰富特征的CRF模型,成为目前基于深度学习的NER方法中的最主流模型。

    3.3.2 IDCNN-CRF

    image-20210614164752444

    ​ 论文Fast and Accurate Entity Recognition with Iterated Dilated Convolutions提出在NER任务中,引入膨胀卷积,一方面可以引入CNN并行计算的优势,提高训练和预测时的速度;另一方面,可以减轻CNN在长序列输入上特征提取能力弱的劣势。具体使用时,dilated width会随着层数的增加而指数增加。这样随着层数的增加,参数数量是线性增加的,而感受野却是指数增加的,这样就可以很快覆盖到全部的输入数据。IDCNN对输入句子的每一个字生成一个logits,这里就和BiLSTM模型输出logits之后完全一样,再放入CRF Layer解码出标注结果。

    3.3.3 CAN-NER

    Convolutional Attention Network for Chinese Named Entity Recognition(NAACL 2019)提出了用基于注意力机制的卷积神经网络架构。
    在这里插入图片描述

    ​ 采用一种卷积注意网络CAN,它由具有局部attention的基于字符的CNN和具有全局attention的GRU组成,用于获取从局部的相邻字符和全局的句子上下文中信息。首先模型输入的是字符,卷积注意力层用来编码输入的字符序列并隐式地对局部语义相关的字符进行分组。对输入进行向量嵌入,包含字向量、分词向量和位置向量,得到输入向量后,采用局部 local attention来捕捉窗口范围内中心词和周围词的依赖,局部 attention 的输出被送到 CNN 中,最后采用加和池化方案。得到局部特征后,进入到BiGRU-CRF 中,而后采用全局的 attention来进一步捕捉句子级别的全局信息。后面接 CRF,得到分类结果。self-attention 可以捕捉广义的上下文信息,减少无用中间词的干扰。

    3.2.4 Lattice LSTM(针对中文的NER)

    ​ 中文的NER与英文不太一样,中文NER问题很大程度上取決于分词的效果,比如实体边界和单词的边界在中文NER可题中经常是一样的。所以在中文NER问题中,有时通常先对文本进行分词然后再预测序列中单词的类别。这样一来会导致一个问题,即在分词中造成的错误会影响到NER的结果。基于字向量的模型能够避免上述问题,但因为单纯采用字向量,导致拆开了很多并不应该拆开的词语,从而丢失了它们本身的内在信息。

    ​ 《Chinese NER Using Lattice LSTM》提出一种用于中文NER的LSTM的格子模型,与基于字符的方法相比,该模型显性地利用词和词序信息;与基于词的方法相比,完整的嵌入词语信息因此 lattice LSTM 不会出现分词错误。门控循环单元使得模型能够从句子中选择最相关的字符和词,以生成更好的 NER 结果。但是,此模型对于一些新的词语效果不理想。

    3.2.5 引入BERT及attention

    在这里插入图片描述

    论文《Multilingual Named Entity Recognition Using Pretrained Embeddings, Attention Mechanism and NCRF》在NCRF和BiLSTM中间加入了一层Multihead Attention,并用BERT来获取上下文词表示,然后设计了一个多任务结构来学习多语言NER。

    4.NER主要数据集

    英文数据集

    ①CoNLL 2003数据集包括1 393篇英语新闻文章和909篇德语新闻文章,英语语料库是免费的,德国语料库需要收费。英语语料取自路透社收集的共享任务数据集。 数据集中标注了4种实体类型:PER,LOC,ORG MISC。
    ② CoNLL 2002数据集是从西班牙EFE新闻机构收集的西班牙共享任务数据集。数据集标注了4种实
    体类型: PER,LOC,ORG,MISC。
    ③ ACE 2004 多语种训练语料库版权属于语言数据联盟(Linguistic Data Consortium, LDC), ACE 2004多语言培训语料库包含用于 2004 年自动内容提取(ACE)技术评估的全套英语、 阿拉伯语和中文培训数据。语言集由为实体和关系标注的各种类型的数据组成。
    ④ ACE 2005 多语种训练语料库版权属于 LDC, 包含完整的英语、阿拉伯语和汉语训练数据, 数据来源包括:微博、广播新闻、新闻组、广播对话等, 可以用来做实体、 关系、 事件抽取等任务。
    ⑤ OntoNotes 5.0 数据集版权属于 LDC, 由 1745K 英语、 900K 中文和 300K 阿拉伯语文本数据组成, OntoNotes 5.0 的数据来源也多种多样, 来自电话对话、新闻通讯社、广播新闻、广播对话和博客等。实体被标注为 PERSON,ORGANIZATION,LOCATION 等 18 个类型。
    ⑥ MUC 7 数据集是发布的可以用于命名实体识别任务, 版权属于 LDC,下载需要支付一定费用。数据取自北美新闻文本语料库的新闻标题, 其中包含 190K 训练集、 64K 测试集。
    ⑦ Twitter数据集是由Zhang等提供,数据收集于Twitter,训练集包含了4 000 推特文章, 3257条推特用户测试。该数据集不仅包含文本信息还包含了图片信息

    其它数据集

    image-20210614172350727

    中文数据集

    • CCKS2017开放的中文的电子病例测评相关的数据。
      评测任务一:https://biendata.com/competition/CCKS2017_1/
      评测任务二:https://biendata.com/competition/CCKS2017_2/
    • CCKS2018开放的音乐领域的实体识别任务。
      评测任务:https://biendata.com/competition/CCKS2018_2/
    • (CoNLL 2002)Annotated Corpus for Named Entity Recognition。
      地址:https://www.kaggle.com/abhinavwalia95/entity-annotated-corpus
    • NLPCC2018开放的任务型对话系统中的口语理解评测。
      地址:http://tcci.ccf.org.cn/conference/2018/taskdata.php
    • 一家公司提供的数据集,包含人名、地名、机构名、专有名词。
      下载地址:https://bosonnlp.com/dev/resource

    5.NER工具

    Stanford NER

    斯坦福大学开发的基于条件随机场的命名实体识别系统,该系统参数是基于CoNLL、MUC-6、MUC-7和ACE命名实体语料训练出来的。

    地址:https://nlp.stanford.edu/software/CRF-NER.shtml

    python实现的Github地址:https://github.com/Lynten/stanford-corenlp

    # 安装:pip install stanfordcorenlp
    # 国内源安装:pip install stanfordcorenlp -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 使用stanfordcorenlp进行命名实体类识别
    # 先下载模型,下载地址:https://nlp.stanford.edu/software/corenlp-backup-download.html
    # 对中文进行实体识别
    from stanfordcorenlp import StanfordCoreNLP
    zh_model = StanfordCoreNLP(r'stanford-corenlp-full-2018-02-27', lang='zh')
    s_zh = '我爱自然语言处理技术!'
    ner_zh = zh_model.ner(s_zh)
    s_zh1 = '我爱北京天安门!'
    ner_zh1 = zh_model.ner(s_zh1)
    print(ner_zh)
    print(ner_zh1)
    
    [('我爱', 'O'), ('自然', 'O'), ('语言', 'O'), ('处理', 'O'), ('技术', 'O'), ('!', 'O')]
    [('我爱', 'O'), ('北京', 'STATE_OR_PROVINCE'), ('天安门', 'FACILITY'), ('!', 'O')]
    
    
    # 对英文进行实体识别
    eng_model = StanfordCoreNLP(r'stanford-corenlp-full-2018-02-27')
    s_eng = 'I love natural language processing technology!'
    ner_eng = eng_model.ner(s_eng)
    s_eng1 = 'I love Beijing Tiananmen!'
    ner_eng1 = eng_model.ner(s_eng1)
    print(ner_eng)
    print(ner_eng1)
    
    [('I', 'O'), ('love', 'O'), ('natural', 'O'), ('language', 'O'), ('processing', 'O'), ('technology', 'O'), ('!', 'O')]
    [('I', 'O'), ('love', 'O'), ('Beijing', 'CITY'), ('Tiananmen', 'LOCATION'), ('!', 'O')]
    

    MALLET

    麻省大学开发的一个统计自然语言处理的开源包,其序列标注工具的应用中能够实现命名实体识别。 官方地址:http://mallet.cs.umass.edu/

    Hanlp

    HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。支持命名实体识别。 Github地址:https://github.com/hankcs/pyhanlp

    官网:http://hanlp.linrunsoft.com/

    # 安装:pip install pyhanlp
    # 国内源安装:pip install pyhanlp  -i https://pypi.tuna.tsinghua.edu.cn/simple
    # 通过crf算法识别实体
    from pyhanlp import *
    # 音译人名示例
    CRFnewSegment = HanLP.newSegment("crf")
    term_list = CRFnewSegment.seg("我爱北京天安门!")
    print(term_list)
    
    [我/r, 爱/v, 北京/ns, 天安门/ns, !/w]
    

    NLTK

    NLTK是一个高效的Python构建的平台,用来处理人类自然语言数据。

    Github地址:https://github.com/nltk/nltk 官网:http://www.nltk.org/

    # 安装:pip install nltk
    # 国内源安装:pip install nltk  -i https://pypi.tuna.tsinghua.edu.cn/simple
    import nltk
    s = 'I love natural language processing technology!'
    s_token = nltk.word_tokenize(s)
    s_tagged = nltk.pos_tag(s_token)
    s_ner = nltk.chunk.ne_chunk(s_tagged)
    print(s_ner)
    

    SpaCy

    工业级的自然语言处理工具,遗憾的是不支持中文。 Gihub地址: https://github.com/explosion/spaCy 官网:https://spacy.io/

    # 安装:pip install spaCy
    # 国内源安装:pip install spaCy  -i https://pypi.tuna.tsinghua.edu.cn/simple
    import spacy 
    eng_model = spacy.load('en')
    s = 'I want to Beijing learning natural language processing technology!'
    # 命名实体识别
    s_ent = eng_model(s)
    for ent in s_ent.ents:
       print(ent, ent.label_, ent.label)
    
    Beijing GPE 382
    

    Crfsuite

    可以载入自己的数据集去训练CRF实体识别模型。

    文档地址:

    https://sklearn-crfsuite.readthedocs.io/en/latest/?badge=latest

    代码已上传:https://github.com/yuquanle/StudyForNLP/blob/master/NLPbasic/NER.ipynb

    6. 总结

    ​ 命名实体识别是自然语言处理应用中的重要步骤, 它不仅检测出实体边界,还检测出命名实体的类型,是文本意义理解的基础。 本文阐述了命名实体识别的研究进展,从早期基于规则和词典的方法,到传统机器学习的方法,到近年来基于深度学习的方法, 神经网络与 CRF 模型相结合的 NN-CRF 模型依旧是目前命名实体识别的主流模型。 未来的研究中,数据标注和非正式文本(评论、论坛发言等未出现过的实体)仍会是两个挑战。迁移学习、对抗学习、远监督学习方法以及图神经网络、注意力机制、NER模型压缩、多类别实体、嵌套实体、实体识别和实体链接联合任务等都会是NER未来研究的重点。

    参考文献

    [1] Zhang Y , Yang J . Chinese NER Using Lattice LSTM[J]. 2018.

    [2] Strubell E , Verga P , Belanger D , et al. Fast and Accurate Entity Recognition with Iterated Dilated Convolutions[J]. 2017.

    [3] Zhu Y , Wang G , Karlsson B F . CAN-NER: Convolutional Attention Network forChinese Named Entity Recognition[J]. 2019.

    [4] Emelyanov A A , Artemova E . Multilingual Named Entity Recognition Using Pretrained Embeddings, Attention Mechanism and NCRF[J]. 2019.

    [5] Li J , Sun A , Han J , et al. A Survey on Deep Learning for Named Entity Recognition[J]. IEEE Transactions on Knowledge and Data Engineering, 2020, PP(99):1-1.

    [6] Ratnaparkhi A . A Maximum Entropy Model for Part-Of-Speech Tagging. 2002.

    [7] MCCALLUM A, FREITAG D, PEREIRA F C N. Maximum Entropy Markov Models for Information Extraction andSegmentation[C]//Icml, 2000, 17: 591-598

    [8] Lafferty J , Mccallum A , Pereira F . Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data[C]// Proc. 18th International Conf. on Machine Learning. 2001.

    [9] 陈曙东, 欧阳小叶. 命名实体识别技术综述[J]. 无线电通信技术, 2020, 046(003):251-260.

    [10] 刘宇鹏, 栗冬冬. 基于BLSTM-CNN-CRF的中文命名实体识别方法[J]. 哈尔滨理工大学学报, 2020, v.25(01):119-124.

    [11] Huang Z , Wei X , Kai Y . Bidirectional LSTM-CRF Models for Sequence Tagging[J]. Computer Science, 2015.

    [12] Xiang R , He W , Meng Q , et al. AFET: Automatic Fine-Grained Entity Typing by Hierarchical Partial-Label Embedding[C]// Proceedings of the 2016 Conference on Empirical Methods in Natural Language Processing. 2016.

    [13] COLLOBERT R, WESTON J, BOTTOU L, et al. Natural Language Processing (almost) from Scratch[J]. Journal of MachineLearning Research, 2011, 12(Aug): 2493-2537

    展开全文
  • 第二十六章 命名实体识别和实体消歧 1 命名实体识别概论 PART1 什么是命名实体识别 PART2 命名识别识别的应用 PART3 简历中抽取关键信息 2 命名实体识别不同方法 PART1 实体识别方法 基于规则的方法 基于...
  • 【C++要笑着学】关键字 | 命名空间 | 输入和输出

    千次阅读 多人点赞 2022-01-20 13:46:37
    本章将正式开始 C++ 的学习,将深入浅出地讲解。本篇将以HelloWorld 开始,以 HelloWorld 结束。通过这段代码,讲解C++中的命名空间和输入与输出。话不多说,让我们开始吧!
  • 3.C++默认命名空间 (1)又叫全局命名空间 (2)默认命名空间引用其他命名空间方法 (3)默认命名空间引用自己的方法 (4)其他命名空间引用默认命名空间中的方法::f(); 4.C++匿名命名空间 1.3.4.1、std和cout的引入 (1)std...
  • 手机芯片命名规则详解

    千次阅读 2021-06-07 15:37:15
    因为华为,三星,苹果的处理器一般只有一种消费者熟知的命名标准,而高通和联发科它们是专门做处理器和其他专业芯片的,它们除了有一套被消费者熟知的命名标准外,还有一种的比较科学的内部代码命名标准。...
  • 帕斯卡命名法、驼峰命名法、匈牙利命名法、下划线命名法其中前三种用的比较多。 1,帕斯卡命名法(Pascal) 程序代码示例: ShowMessage(); string PassWord; 单字之间不以空格断开或连接号(-)、底线(_)...
  • 目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。 驼峰命令法(Camel):  也称骆驼式命名法正如它的名称所表示的那样,是指混合使用大小写...
  • 一文了解命名实体识别

    千次阅读 2020-09-04 20:25:53
    导读:从1991年开始,命名实体识别逐渐开始走进人们的视野,在各评测会议的推动下,命名实体识别技术得到了极大地发展,从最初的基于规则和字典的方法,到现在热门的注意力机制、图神经网络等方法,命名实体识别已经...
  • 数据库表字段命名规则

    千次阅读 2021-03-14 15:45:46
    一、数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔,一个项目一个数据库,多个项目慎用同一个数据库二、数据库表命名规范2.1数据...
  • JavaScript常见变量和函数命名示例

    万次阅读 2020-07-21 15:16:17
    在开发过程中必然会遇到命名的问题,你会词穷、纠结、惆怅吗?本文的出现相信能够解决大部分烦恼,让你轻松写出符合规范、易读、简短的代码。 本文将通过大量的实例来试图自圆其说,形成一套系统化、实用的变量命名...
  • Java命名规范

    千次阅读 2022-02-16 20:53:58
    文章目录一、Java总体命名规范二、Java包名命名规范常规包名自定义包名 一、Java总体命名规范 1、项目名全部小写. 2、包名全部小写. 3、类名首字母大写,其余组成词首字母依次大写. 4、变量名,方法名首字母小写,如果...
  • 现在有很多语言,但是在编程时有良好的命名习惯,代码易读,而且对代码调试和维护都有巨大好处。一般程序员不使用诸如ThisVariableIsATemporaryCounter这样“聪明”的名字。程序员常用tmp,这写起来更简单,也不会更...
  • C++命名规则&书写规范

    千次阅读 2021-05-12 09:49:44
    常见命名法: 匈牙利命名法:基本原则是:变量名=属性+类型+对象描述\color{blue}{变量名=属性+类型+对象描述}变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字...
  • python中的变量命名规则

    千次阅读 2022-03-12 13:39:11
    There are only two hard things in Computer Science: cache ...python中的变量命名规则1.变量命名2. 变量命名的描述性3.变量名尽量短,但是不要太短4.合理使用变量5. 变量定义尽量靠近使用6. 合理使用namedtuple/
  • 图解python | 命名空间与作用域

    千次阅读 2022-02-23 17:25:12
    命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug。
  • java命名规范:驼峰命名法则

    千次阅读 2020-04-28 09:37:06
    java命名规范:驼峰命名法则 使用前注意事项: 1、由于Java面向对象编程的特性, 在命名时应尽量选择名词 2、驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首...
  • 【NLP】一文了解命名实体识别

    千次阅读 2020-09-06 11:00:00
    导读:从1991年开始,命名实体识别逐渐开始走进人们的视野,在各评测会议的推动下,命名实体识别技术得到了极大地发展,从最初的基于规则和字典的方法,到现在热门的注意力机制、图神经网络等方法...
  • JAVA命名规范

    千次阅读 2021-02-12 20:45:39
    1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.2.[强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.3.[强制] 类名使用UpperCamelCase风格,必须遵守...
  • miRNA命名规范

    千次阅读 2020-02-15 19:19:29
    miRNA的研究起步很早,最早发现的miRNA是线虫中的let-7 和lin-4,随着越来越多的miRNA被发现,为了方便学术交流,有科学家提出了一套统一的命名规范,对应的文献如下 ...
  • C++入门级——命名空间

    千次阅读 2022-04-26 08:50:44
    命名空间的定义 (1) 普通的命名空间 (2)命名空间的嵌套 (3)同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 2.命名空间的使用 Ⅰ. 加命名空间名称及作用域限定符 Ⅱ. ...
  • 烷烃的系统命名

    千次阅读 2020-12-22 08:30:29
    与《烷烃的系统命名》相关的范文烷烃的命名 一.选择题 1.用系统命名法给下列烷烃命名时,可以作为编号起点的碳原子是( ) A.a B.b C.c D.d 2.在系统命名法中下列碳原子主链名称是丁烷的是( ) A.(CH3)2CHCH2CH2...
  • linux命名空间(namespace)学习(三)

    千次阅读 2018-12-08 11:09:40
    LinuxPID命名空间学习 通过对于前两节的学习我们知道Linux内核使用task_struct结构来表示和管理进程,这个数据结构里面存放了很多有关于PID如何管理的数据,可以这么说,Linux内核所有有关进程管理的数据结构都和此...
  • pep8 命名规范

    千次阅读 2019-11-15 21:28:24
    Naming Conventions 命名规范 Python库的命名规范很乱,从来没能做到完全一致。但是目前有一些推荐的命名标准。新的模块和包(包括第三方框架)应该用这套标准,但当一个已有库采用了不同的风格,推荐保持内部一致性...
  • java命名规范

    千次阅读 2021-02-12 12:48:41
    一,java文件命名规范1.包名(package)命名必须全部使用英文小写字母,禁止使用“下划线”等字符。(除常量外,Java命名习惯中均不推荐使用下划线等字符)项目包命名规则:..。相关项目可使用...的命名法则。2.Class/...
  • /** * * * @projectName mybatis-demo * * @title HumpNamedTools ... * * @description 驼峰命名与sql下划线字段之间的转换工具 * * @author IT_CREAT * * @date 2019 2019/jpicker/14 10:36 * * @versio.
  • 基于BERT预训练的中文命名实体识别TensorFlow实现

    万次阅读 多人点赞 2019-01-03 11:58:25
    BERT-BiLSMT-CRF-NER Tensorflow solution of ...使用谷歌的BERT模型在BLSTM-CRF模型上进行预训练用于中文命名实体识别的Tensorflow代码’ 代码已经托管到GitHub 代码传送门 大家可以去clone 下来亲自体验一下! g...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,307,067
精华内容 922,826
关键字:

命名

友情链接: gerenxinxiguanli.zip