nlp_nlpir - CSDN
nlp 订阅
NLP是神经语言程序学(Neuro-Linguistic Programming)的英文缩写。在香港,也有意译为身心语法程式学的。N(Neuro)指的是神经系统,包括大脑和思维过程。L(Linguistic)是指语言,更准确点说,是指从感觉信号的输入到构成意思的过程。P(Programming)是指为产生某种后果而要执行的一套具体指令。即指我们思维上及行为上的习惯,就如同电脑中的程序,可以透过更新软件而改变。故此,NLP被解释为研究我们的大脑如何工作的学问。也因此,NLP译为“身心语法程式学”或“神经语言程序学”。 [1]  最初的约翰·格林德(John Thomas Grinder)和理查·班德勒(Richard Wayne Bandler)虽然不是正式的心理学家,但对成功人士、心理学、语言和计算机程序有着浓厚兴趣,借鉴了一些催眠和心理学的理论,发展出“场域”、“能量”、“心法”的层面。NLP在发展道路上不断吸取逻辑学、心理学、哲学等其他学科的观点并整合成自身的学术论点,这种包容的结合给了NLP作为一个学术的逻辑体系。 展开全文
NLP是神经语言程序学(Neuro-Linguistic Programming)的英文缩写。在香港,也有意译为身心语法程式学的。N(Neuro)指的是神经系统,包括大脑和思维过程。L(Linguistic)是指语言,更准确点说,是指从感觉信号的输入到构成意思的过程。P(Programming)是指为产生某种后果而要执行的一套具体指令。即指我们思维上及行为上的习惯,就如同电脑中的程序,可以透过更新软件而改变。故此,NLP被解释为研究我们的大脑如何工作的学问。也因此,NLP译为“身心语法程式学”或“神经语言程序学”。 [1]  最初的约翰·格林德(John Thomas Grinder)和理查·班德勒(Richard Wayne Bandler)虽然不是正式的心理学家,但对成功人士、心理学、语言和计算机程序有着浓厚兴趣,借鉴了一些催眠和心理学的理论,发展出“场域”、“能量”、“心法”的层面。NLP在发展道路上不断吸取逻辑学、心理学、哲学等其他学科的观点并整合成自身的学术论点,这种包容的结合给了NLP作为一个学术的逻辑体系。
信息
外文名
Neuro-Linguistic Programming
发现者
格林德和班德勒
中文名
神经语言程序学
NLP的定义
指神经系统,意译为身心
nlp创始人
NLP主要的发现者是约翰·格林德和理查德·班德勒。格林德是世界最负盛名的 语言学家之一,班德勒是一位数学家、完形心理学家和电脑专家。他们决定集两人之力去进行一桩模仿他人的研究,对象是那些在多方面都甚有成就之人。他二人分析了一些成功的商人、医师和其他行业中的佼佼者,试图能从他们多年尝试错误后的成功中,归结出一些成功的模式。他们对下列三人的模仿,经分类后所建立的诸多有效的行为介入模式,使得他们声名大噪。这三人是当代最伟大的催眠疗法学家之一的埃里克森医师,杰出的家庭医师沙提尔女士和人类学家贝特森。例如,格林德和班德勒二人发现沙提亚能轻易地建立人际关系,而其他的同业却不行。所以他们找出她特有的模式,也教导学生运用,即使他们没有任何执业经验,但也做出与沙提尔毫不逊色的成绩来。他们播下相同的种子,收获也相同。从他们三人身上模仿所归结出基本模式的经验,帮助格林德和班德勒也建立自己的模式并传授出去,这些模式就是我们所熟知的NLP。
收起全文
精华内容
参与话题
  • 从零开始自然语言处理

    千人学习 2020-07-22 15:48:45
    本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,...
  • 自然语言处理(NLP)入门

    万次阅读 多人点赞 2017-11-21 20:32:26
    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库。什么是NLP?简单来说,自然语言处理(NLP)就是开发能够理解人类语言的应用程序...

    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库。

    什么是NLP?

    简单来说,自然语言处理(NLP)就是开发能够理解人类语言的应用程序或服务。

    这里讨论一些自然语言处理(NLP)的实际应用例子,如语音识别、语音翻译、理解完整的句子、理解匹配词的同义词,以及生成语法正确完整句子和段落。

    这并不是NLP能做的所有事情。

    NLP实现

    搜索引擎: 比如谷歌,Yahoo等。谷歌搜索引擎知道你是一个技术人员,所以它显示与技术相关的结果;

    社交网站推送:比如Facebook News Feed。如果News Feed算法知道你的兴趣是自然语言处理,就会显示相关的广告和帖子。

    语音引擎:比如Apple的Siri。

    垃圾邮件过滤:如谷歌垃圾邮件过滤器。和普通垃圾邮件过滤不同,它通过了解邮件内容里面的的深层意义,来判断是不是垃圾邮件。

    NLP库

    下面是一些开源的自然语言处理库(NLP):

    Natural language toolkit (NLTK);
    Apache OpenNLP;
    Stanford NLP suite;
    Gate NLP library

    其中自然语言工具包(NLTK)是最受欢迎的自然语言处理库(NLP),它是用Python编写的,而且背后有非常强大的社区支持。

    NLTK也很容易上手,实际上,它是最简单的自然语言处理(NLP)库。

    在这个NLP教程中,我们将使用Python NLTK库。

    安装 NLTK

    如果您使用的是Windows/Linux/Mac,您可以使用pip安装NLTK:

    pip install nltk

    打开python终端导入NLTK检查NLTK是否正确安装:

    import nltk

    如果一切顺利,这意味着您已经成功地安装了NLTK库。首次安装了NLTK,需要通过运行以下代码来安装NLTK扩展包:

    import nltk
    
    nltk.download()

    这将弹出NLTK 下载窗口来选择需要安装哪些包:
    这里写图片描述
    您可以安装所有的包,因为它们的大小都很小,所以没有什么问题。

    使用Python Tokenize文本

    首先,我们将抓取一个web页面内容,然后分析文本了解页面的内容。

    我们将使用urllib模块来抓取web页面:

    import urllib.request
    
    response = urllib.request.urlopen('http://php.net/')
    html = response.read()
    print (html)

    从打印结果中可以看到,结果包含许多需要清理的HTML标签。

    然后BeautifulSoup模块来清洗这样的文字:

    from bs4 import BeautifulSoup
    
    import urllib.request
    response = urllib.request.urlopen('http://php.net/')
    html = response.read()
    soup = BeautifulSoup(html,"html5lib")

    这需要安装html5lib模块

    text = soup.get_text(strip=True)
    print (text)

    现在我们从抓取的网页中得到了一个干净的文本。

    下一步,将文本转换为tokens,像这样:

    from bs4 import BeautifulSoup
    import urllib.request
    
    response = urllib.request.urlopen('http://php.net/')
    html = response.read()
    soup = BeautifulSoup(html,"html5lib")
    text = soup.get_text(strip=True)
    tokens = text.split()
    print (tokens)

    统计词频

    text已经处理完毕了,现在使用Python NLTK统计token的频率分布。

    可以通过调用NLTK中的FreqDist()方法实现:

    from bs4 import BeautifulSoup
    import urllib.request
    import nltk
    
    response = urllib.request.urlopen('http://php.net/')
    html = response.read()
    soup = BeautifulSoup(html,"html5lib")
    text = soup.get_text(strip=True)
    tokens = text.split()
    freq = nltk.FreqDist(tokens)
    for key,val in freq.items():
        print (str(key) + ':' + str(val))
    

    如果搜索输出结果,可以发现最常见的token是PHP。

    您可以调用plot函数做出频率分布图:

    freq.plot(20, cumulative=False)
    # 需要安装matplotlib库

    这里写图片描述

    这上面这些单词。比如of,a,an等等,这些词都属于停用词。

    一般来说,停用词应该删除,防止它们影响分析结果。

    处理停用词

    NLTK自带了许多种语言的停用词列表,如果你获取英文停用词:

    from nltk.corpus import stopwords
    
    stopwords.words('english')

    现在,修改下代码,在绘图之前清除一些无效的token:

    clean_tokens = list()
    sr = stopwords.words('english')
    for token in tokens:
        if token not in sr:
            clean_tokens.append(token)

    最终的代码应该是这样的:

    from bs4 import BeautifulSoup
    import urllib.request
    import nltk
    from nltk.corpus import stopwords
    
    response = urllib.request.urlopen('http://php.net/')
    html = response.read()
    soup = BeautifulSoup(html,"html5lib")
    text = soup.get_text(strip=True)
    tokens = text.split()
    clean_tokens = list()
    sr = stopwords.words('english')
    for token in tokens:
        if not token in sr:
            clean_tokens.append(token)
    freq = nltk.FreqDist(clean_tokens)
    for key,val in freq.items():
        print (str(key) + ':' + str(val))

    现在再做一次词频统计图,效果会比之前好些,因为剔除了停用词:

    freq.plot(20,cumulative=False)

    这里写图片描述

    使用NLTK Tokenize文本

    在之前我们用split方法将文本分割成tokens,现在我们使用NLTK来Tokenize文本。

    文本没有Tokenize之前是无法处理的,所以对文本进行Tokenize非常重要的。token化过程意味着将大的部件分割为小部件。

    你可以将段落tokenize成句子,将句子tokenize成单个词,NLTK分别提供了句子tokenizer和单词tokenizer。

    假如有这样这段文本:

    Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude

    使用句子tokenizer将文本tokenize成句子:

    from nltk.tokenize import sent_tokenize
    
    mytext = "Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
    print(sent_tokenize(mytext))

    输出如下:

    ['Hello Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

    这是你可能会想,这也太简单了,不需要使用NLTK的tokenizer都可以,直接使用正则表达式来拆分句子就行,因为每个句子都有标点和空格。

    那么再来看下面的文本:

    Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude.

    这样如果使用标点符号拆分,Hello Mr将会被认为是一个句子,如果使用NLTK:

    from nltk.tokenize import sent_tokenize
    
    mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
    print(sent_tokenize(mytext))

    输出如下:

    ['Hello Mr. Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

    这才是正确的拆分。

    接下来试试单词tokenizer:

    from nltk.tokenize import word_tokenize
    
    mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
    print(word_tokenize(mytext))

    输出如下:

    ['Hello', 'Mr.', 'Adam', ',', 'how', 'are', 'you', '?', 'I', 'hope', 'everything', 'is', 'going', 'well', '.', 'Today', 'is', 'a', 'good', 'day', ',', 'see', 'you', 'dude', '.']

    Mr.这个词也没有被分开。NLTK使用的是punkt模块的PunktSentenceTokenizer,它是NLTK.tokenize的一部分。而且这个tokenizer经过训练,可以适用于多种语言。

    非英文Tokenize

    Tokenize时可以指定语言:

    from nltk.tokenize import sent_tokenize
    
    mytext = "Bonjour M. Adam, comment allez-vous? J'espère que tout va bien. Aujourd'hui est un bon jour."
    print(sent_tokenize(mytext,"french"))

    输出结果如下:

    ['Bonjour M. Adam, comment allez-vous?', "J'espère que tout va bien.", "Aujourd'hui est un bon jour."]

    同义词处理

    使用nltk.download()安装界面,其中一个包是WordNet。

    WordNet是一个为自然语言处理而建立的数据库。它包括一些同义词组和一些简短的定义。

    您可以这样获取某个给定单词的定义和示例:

    from nltk.corpus import wordnet
    
    syn = wordnet.synsets("pain")
    print(syn[0].definition())
    print(syn[0].examples())

    输出结果是:

    a symptom of some physical hurt or disorder
    ['the patient developed severe pain and distension']

    WordNet包含了很多定义:

    from nltk.corpus import wordnet
    
    syn = wordnet.synsets("NLP")
    print(syn[0].definition())
    syn = wordnet.synsets("Python")
    print(syn[0].definition())

    结果如下:

    the branch of information science that deals with natural language information
    large Old World boas
    

    可以像这样使用WordNet来获取同义词:

    from nltk.corpus import wordnet
    
    synonyms = []
    for syn in wordnet.synsets('Computer'):
        for lemma in syn.lemmas():
            synonyms.append(lemma.name())
    print(synonyms)

    输出:

    ['computer', 'computing_machine', 'computing_device', 'data_processor', 'electronic_computer', 'information_processing_system', 'calculator', 'reckoner', 'figurer', 'estimator', 'computer']

    反义词处理

    也可以用同样的方法得到反义词:

    from nltk.corpus import wordnet
    
    antonyms = []
    for syn in wordnet.synsets("small"):
        for l in syn.lemmas():
            if l.antonyms():
                antonyms.append(l.antonyms()[0].name())
    print(antonyms)
    

    输出:

    ['large', 'big', 'big']

    词干提取

    语言形态学和信息检索里,词干提取是去除词缀得到词根的过程,例如working的词干为work。

    搜索引擎在索引页面时就会使用这种技术,所以很多人为相同的单词写出不同的版本。

    有很多种算法可以避免这种情况,最常见的是波特词干算法。NLTK有一个名为PorterStemmer的类,就是这个算法的实现:

    from nltk.stem import PorterStemmer
    
    stemmer = PorterStemmer()
    print(stemmer.stem('working'))
    print(stemmer.stem('worked'))

    输出结果是:

    work
    work

    还有其他的一些词干提取算法,比如 Lancaster词干算法。

    非英文词干提取

    除了英文之外,SnowballStemmer还支持13种语言。

    支持的语言:

    from nltk.stem import SnowballStemmer
    
    print(SnowballStemmer.languages)
    
    'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'spanish', 'swedish'

    你可以使用SnowballStemmer类的stem函数来提取像这样的非英文单词:

    from nltk.stem import SnowballStemmer
    
    french_stemmer = SnowballStemmer('french')
    
    print(french_stemmer.stem("French word"))

    单词变体还原

    单词变体还原类似于词干,但不同的是,变体还原的结果是一个真实的单词。不同于词干,当你试图提取某些词时,它会产生类似的词:

    from nltk.stem import PorterStemmer
    
    stemmer = PorterStemmer()
    
    print(stemmer.stem('increases'))

    结果:

    increas

    现在,如果用NLTK的WordNet来对同一个单词进行变体还原,才是正确的结果:

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    
    print(lemmatizer.lemmatize('increases'))

    结果:

    increase

    结果可能会是一个同义词或同一个意思的不同单词。

    有时候将一个单词做变体还原时,总是得到相同的词。

    这是因为语言的默认部分是名词。要得到动词,可以这样指定:

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    
    print(lemmatizer.lemmatize('playing', pos="v"))

    结果:

    play

    实际上,这也是一种很好的文本压缩方式,最终得到文本只有原先的50%到60%。

    结果还可以是动词(v)、名词(n)、形容词(a)或副词(r):

    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    print(lemmatizer.lemmatize('playing', pos="v"))
    print(lemmatizer.lemmatize('playing', pos="n"))
    print(lemmatizer.lemmatize('playing', pos="a"))
    print(lemmatizer.lemmatize('playing', pos="r"))
    

    输出:

    play
    playing
    playing
    playing
    

    词干和变体的区别

    通过下面例子来观察:

    from nltk.stem import WordNetLemmatizer
    from nltk.stem import PorterStemmer
    
    stemmer = PorterStemmer()
    lemmatizer = WordNetLemmatizer()
    print(stemmer.stem('stones'))
    print(stemmer.stem('speaking'))
    print(stemmer.stem('bedroom'))
    print(stemmer.stem('jokes'))
    print(stemmer.stem('lisa'))
    print(stemmer.stem('purple'))
    print('----------------------')
    print(lemmatizer.lemmatize('stones'))
    print(lemmatizer.lemmatize('speaking'))
    print(lemmatizer.lemmatize('bedroom'))
    print(lemmatizer.lemmatize('jokes'))
    print(lemmatizer.lemmatize('lisa'))
    print(lemmatizer.lemmatize('purple'))
    

    输出:

    stone
    speak
    bedroom
    joke
    lisa

    purpl

    stone
    speaking
    bedroom
    joke
    lisa
    purple

    词干提取不会考虑语境,这也是为什么词干提取比变体还原快且准确度低的原因。

    个人认为,变体还原比词干提取更好。单词变体还原返回一个真实的单词,即使它不是同一个单词,也是同义词,但至少它是一个真实存在的单词。

    如果你只关心速度,不在意准确度,这时你可以选用词干提取。

    在此NLP教程中讨论的所有步骤都只是文本预处理。在以后的文章中,将会使用Python NLTK来实现文本分析。

    我已经尽量使文章通俗易懂。希望能对你有所帮助。

    展开全文
  • NLP学习(一)—基础篇

    万次阅读 多人点赞 2019-04-11 10:53:02
    本次代码的环境: 运行平台: Windows Python版本: Python3.x IDE: PyCharm 一、 前言 2016年3月9日至15日和2017年5月23日至27日,分别在韩国首尔和中国嘉兴乌镇,韩国围棋九段棋手李世石、中国围棋九段棋手柯洁与...

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
    本次代码的环境:
    运行平台: Windows
    Python版本: Python3.x
    IDE: PyCharm

    一、 前言

    2016年3月9日至15日和2017年5月23日至27日,分别在韩国首尔和中国嘉兴乌镇,韩国围棋九段棋手李世石、中国围棋九段棋手柯洁与人工智能围棋程序“阿尔法围棋”(AlphaGo)之间的两场比赛,人类均以失败告终,更是激起了各种“机器超越、控制人类”的讨论,然而机器真的懂人类进而控制人类吗?如果可以那首先必须要先让机器能理解人类的语言。那么机器是如何理解人类语言的呢?这一系列的博文将带领大家熟悉和回顾一个完整的自然语言处理过程。
    首先理解什么是NLP呢?

    NLP (Natural Langunge Possns,自然语言处理)是计算机科学领域以及人工智能领域的一个重要的研究方向,它研究用计算机来处理、理解以及运用人类语言(如中文、英文等),达到人与计算机之间进行有效通讯。所谓“自然”乃是寓意自然进化形成,是为了区分一些人造语言,类似C++、Java 等人为设计的语言。

    二、内容

    2.1 NLP技术点

    接下来通过分析对象和分析内容两个不同的维度来进行表达,NLP 所包含的技术知识点如图2.1所示:
     


    在这里插入图片描述
    图2.1 NLP 技术知识点汇总

    2.2 NLP处理过程

    中文自然语言处理的过程和机器学习过程大体一致,但又存在很多细节上的不同点,下面我们就来看看中文自然语言处理的基本过程有哪些呢?

    2.2.1 获取语料

    语料,即语言材料。语料是语言学研究的内容。语料是构成语料库的基本单元。所以,人们简单地用文本作为替代,并把文本中的上下文关系作为现实世界中语言的上下文关系的替代品。我们把一个文本集合称为语料库(Corpus),当有几个这样的文本集合的时候,我们称之为语料库集合(Corpora)。(定义来源:百度百科)按语料来源,我们将语料分为以下两种:

    • 1.已有语料
      很多业务部门、公司等组织随着业务发展都会积累有大量的纸质或者电子文本资料。那么,对于这些资料,在允许的条件下我们稍加整合,把纸质的文本全部电子化就可以作为我们的语料库。
    • 2.网上下载、抓取语料
      如果现在个人手里没有数据怎么办呢?这个时候,我们可以选择获取国内外标准开放数据集,比如国内的中文汉语有搜狗语料、人民日报语料。国外的因为大都是英文或者外文,这里暂时用不到。也可以选择通过爬虫自己去抓取一些数据,然后来进行后续内容。

    2.2.2 语料预处理

    在一个完整的中文自然语言处理工程应用中,语料预处理大概会占到整个50%-70%的工作量,所以开发人员大部分时间就在进行语料预处理。下面通过数据洗清、分词、词性标注、去停用词四个大的方面来完成语料的预处理工作。

    • 1.语料清洗
      数据清洗,顾名思义就是在语料中找到我们感兴趣的东西,把不感兴趣的、视为噪音的内容清洗删除,包括对于原始文本提取标题、摘要、正文等信息,对于爬取的网页内容,去除广告、标签、HTML、JS 等代码和注释等。常见的数据清洗方式有:人工去重、对齐、删除和标注等,或者规则提取内容、正则表达式匹配、根据词性和命名实体提取、编写脚本或者代码批处理等。
    • 2.分词
      中文语料数据为一批短文本或者长文本,比如:句子,文章摘要,段落或者整篇文章组成的一个集合。一般句子、段落之间的字、词语是连续的,有一定含义。而进行文本挖掘分析时,我们希望文本处理的最小单位粒度是词或者词语,所以这个时候就需要分词来将文本全部进行分词。
      常见的分词算法有:基于字符串匹配的分词方法、基于理解的分词方法、基于统计的分词方法和基于规则的分词方法,每种方法下面对应许多具体的算法。
      当前中文分词算法的主要难点有歧义识别和新词识别,比如:“羽毛球拍卖完了”,这个可以切分成“羽毛 球拍 卖 完 了”,也可切分成“羽毛球 拍卖 完 了”,如果不依赖上下文其他的句子,恐怕很难知道如何去理解。
    • 3.词性标注
      词性标注,就是给每个词或者词语打词类标签,如形容词、动词、名词等。这样做可以让文本在后面的处理中融入更多有用的语言信息。词性标注是一个经典的序列标注问题,不过对于有些中文自然语言处理来说,词性标注不是非必需的。比如,常见的文本分类就不用关心词性问题,但是类似情感分析、知识推理却是需要的,下图2.2是常见的中文词性整理。
       

      在这里插入图片描述
      图2.2 中文词性

    常见的词性标注方法可以分为基于规则和基于统计的方法。其中基于统计的方法,如基于最大熵的词性标注、基于统计最大概率输出词性和基于 HMM 的词性标注。

    • 4.去停用词
      停用词一般指对文本特征没有任何贡献作用的字词,比如标点符号、语气、人称等一些词。所以在一般性的文本处理中,分词之后,接下来一步就是去停用词。但是对于中文来说,去停用词操作不是一成不变的,停用词词典是根据具体场景来决定的,比如在情感分析中,语气词、感叹号是应该保留的,因为他们对表示语气程度、感情色彩有一定的贡献和意义。

    2.2.3 特征工程

    做完语料预处理之后,接下来需要考虑如何把分词之后的字和词语表示成计算机能够计算的类型。显然,如果要计算我们至少需要把中文分词的字符串转换成数字,确切的说应该是向量话。有两种常用的表示模型分别是词袋模型和词向量

    • 词袋模型(Bag of Word, BOW),即不考虑词语原本在句子中的顺序,直接将每一个词语或者符号统一放置在一个集合(如 list),然后按照计数的方式对出现的次数进行统计。
    • 词向量是将字、词语转换成向量矩阵的计算模型。目前为止最常用的词表示方法是 One-hot,这种方法把每个词表示为一个很长的向量。

    2.2.4 特征选择

    同数据挖掘一样,在文本挖掘相关问题中,特征工程也是必不可少的。在一个实际问题中,构造好的特征向量,是要选择合适的、表达能力强的特征。文本特征一般都是词语,具有语义信息,使用特征选择能够找出一个特征子集,其仍然可以保留语义信息;但通过特征提取找到的特征子空间,将会丢失部分语义信息。所以特征选择是一个很有挑战的过程,更多的依赖于经验和专业知识,并且有很多现成的算法来进行特征的选择。目前,常见的特征选择方法主要有 DF、 MI、 IG、 CHI、WLLR、WFO 六种。

    2.2.5 模型训练

    在特征向量选择好之后,接下来要做的事情当然就是训练模型,对于不同的应用需求,我们使用不同的模型,传统的有监督和无监督等机器学习模型, 如 KNN、SVM、Naive Bayes、决策树、GBDT、K-means 等模型;深度学习模型比如 CNN、RNN、LSTM、 Seq2Seq、FastText、TextCNN 等。这些模型在后续的分类、聚类、神经序列、情感分析等示例中都会用到。下面是在模型训练时需要注意的几个点。

    • 1.注意过拟合、欠拟合问题,不断提高模型的泛化能力。

      • 过拟合:模型学习能力太强,以至于把噪声数据的特征也学习到了,导致模型泛化能力下降,在训练集上表现很好,但是在测试集上表现很差。
        常见的解决方法有:

        • 增大数据的训练量;
        • 增加正则化项,如 L1 正则和 L2 正则;
        • 特征选取不合理,人工筛选特征和使用特征选择算法;
        • 采用 Dropout 方法等。
      • 欠拟合:就是模型不能够很好地拟合数据,表现在模型过于简单。
        常见的解决方法有:

        • 添加其他特征项;
        • 增加模型复杂度,比如神经网络加更多的层、线性模型通过添加多项式使模型泛化能力更强;
        • 减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
    • 2.对于神经网络,注意梯度消失和梯度爆炸问题。

    2.2.6 评价指标

    训练好的模型,上线之前要对模型进行必要的评估,目的让模型对语料具备较好的泛化能力。具体有以下这些指标可以参考。

    • 1.错误率、精度、准确率、精确度、召回率、F1 衡量。

    • 2.ROC 曲线、AUC 曲线。
      ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。我们根据模型的预测结果,把阈值从0变到最大,即刚开始是把每个样本作为正例进行预测,随着阈值的增大,学习器预测正样例数越来越少,直到最后没有一个样本是正样例。

    2.3 NLP研究任务

    NLP可以被应用于很多领城,这里大概总结出以下几种通用的应用:

    • 机器翻译:计算机具备将一种谐育翻译成另一种语 言的能力。
    • 情感分析:计算机能够判断用户评论是香积极。
    • 智能问答:计算机能够正确回答输人的问题。
    • 文摘生成:计算机能够准确日纳、总结井产生文本摘要。
    • 文本分类计算机能够采集各种文章,进行主题分析,从而进行行自动分类。
    • 舆论分析:计算机能够判断目前舆论的导向。
    • 知识图谱: 知识点相互连接而成的语义网络。

    2.3.1 机器翻译

    机器翻译是自然语言处理中最为人所熟知的场景,国内外有很多比较成熟的机器翻译产品,比如百度翻译、Google翻译等,还有提供支持语音输人的多国语互译的产品(比如科大讯飞就出了-款翻译札)。

    2.3.2 情感分析

    情感分析在一些评论网站 比较有用,比如某餐饮网站的评论中会有非常多拔草的客人的评价,如果一眼扫过去满眼都是又贵又难吃,那谁还想去呢?另外有些商家为了获取大量的客户不惜雇佣水军灌水,那就可以通过自然语言处理来做水军识别,情感分析来分析总体用户评价是积极还是消极。

    2.3.4 智能问答

    智能问答在一-些电商网站有非常实际的价值,比如代替人工充当客服角色,有很多基本而且重复的问题,其实并不需要人工客服来解决,通过智能问容系统可以筛选掉大最重复的问题,使得人工座席能更好地服务客户。

    2.3.5 文摘生成

    文摘生成利用计算机自动地从原始文献中摘取文摘,全面准确地反映某文献的中心内容。这个技术可以帮助人们节省大量的时间成本,而且效率更高。

    2.3.6 文本分类

    文本分类是机器对文本按照-定的分类体系自动标注类别的过程。举一个例子 ,圾邮件是一种令 人头痛的顽症,困扰着非常多的互联网用户。2002 年,Paul Graham机出使用“贝叶斯推断”来过滤垃圾邮件,1000 封垃圾邮件中可以过滤掉995封并且没有一个是误判,另外这种过滤器还具有自我学习功能,会根据新收到的邮件,不断调整。也就是说收到的垃圾邮件越多,相对应的判断垃圾邮件的准确率就越高。

    2.3.7 舆论分析

    舆论分析可以帮助分析哪些话题是目前的热点,分析传播路径以及发展趋势,对于不好的舆论导向可以进行有效的控制。

    2.3.8 知识图谱

    知识图谱( Knowledge Graph/Vault)又称科学知识图谱,在图书情报界称为知识域可视化或知识领域映射地图,是显示知识发展进程与结构关系的一系列各 种不同的图形,用可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。

    2.4 知识结构

    作为一门综合学科,NLP是研究人与机器之间用自然语言进行有效通信的理论和方法。这需要很多跨学科的知识,需要语言学、统计学、最优化理论、机器学习、深度学习以及自然语育处理相关理论模型知识做基础。作为一门杂学,NLP可谓包罗万象,体系化与特殊化并存,这里简单罗列其知识体系,如下图2.3所示:
     


    在这里插入图片描述
    图2.3 知识结构
    ▼有法语义分析:针对目标句子,进行各种句法分析,如分词、 词性标记、命名实体识别及链接、句法分析、语义角色识别和多义词消歧等。
    ▼关键词抽取:抽取目标文本中的主要信息,比如从一条新闻中抽取关键信息。主要是了解是谁、于何时、为何、对谁、做了何事、产生了有什么结果。涉及实体识别、时间抽取、因果关系抽取等多项关键技术。
    ▼文本挖掘:主要包含了对文本的聚类、分类,信息抽取、摘要、情感分析以及对挖掘的信息和知识的可视化、交互式的呈现界面。
    ▼机器翻译:将输人的源语言文本通过自动翻译转化为另种语言的文本。根据输人数据类型的不同,可细分为文本翻译、语音翻译、手语翻译、图形翻译等。机器翻译从最早的基于规则到二十年前的基于统计的方法,再到今天的基于深度学习(编解码)的方法,逐渐形成了一套比较严谨的方法体系。
    ▼信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋以不同的权重来建立索引,也可使用算法模型来建立更加深层的索引。查询时,首先对输入比进行分析,然后在索引里面查找匹配的候选文档,再根据个排序 机制把候选文档排序,最后输出排序得分最高的文档。
    ▼问答系统:针对某个自然语言表达的问题,由问答系统给出一个精准的答案。需
    要对自然语言查询语句进行语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
    ▼对话系统:系统通过多回合对话,跟用户进行聊天、回答、完成某项任务。主要涉及用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。同时,为了体现个性化,基于用户画像做个性化回复。

    2.5 知识结构

    自然语言处理可以分为以下三个层面:
    (1) 第一层面:词法分析
    词法分析包括汉语的分词和词性标注这两部分。之前有提过,汉语分词与英文不同,汉语书面词语之间没有明显的空格标记,文本中的句子以字竹串的方式出现,向子中心逗号分隔,句子和句子之间常以句号分隔。针对议语这种独特的书面表现形式,汉语的自然语言处理的首要工作就是要将输人的文本切分为单独的词语,然后在此技术上进行其他更高级的分析。
    上述这个步骤称为分词。除了分词之外,词性标注也通常被认为是词法分析的一部分,词性标注的目的是为每一个词赋予一个类别,这个类别可以是名词(noun)、动词(verb)、形容词(adjective)等。通常来说,属于相同词性的词,在句法中承担类似的角色。
    (2)第二层面:句法分析
    句法分析是对输人的文本以句子为单位,进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是为了帮助理解句子的含义,另一方面也为更高级的自然语言处理任务提供支持(比如机器翻译、情感分析等)。目前业界存在三种比较主流的句法分析方法:短语结构句法体系,作用是识别出句子中的短语结构以及短语之间的层次句法关系;依存结构句法体系,作用是识别句子中词与词之间的相互依赖关系;深层文法句法分析,利用深层文法,例如词汇化树邻接文法,组合范畴文法等对句子进行深层的句法以及语义分析。
    上述几种句法分析,依存句法分析属于浅层句法分析,其实现过程相对来说比较简单而且适合在多语言环境下应用,但是其所能提供的信息也相对较少。深层文法句法分析可以提供丰富的句法和语义信息,但是采用的文法相对比较复杂,分析器的运行复杂度也比较高,这使得深层句法分析不太适合处理大规模的数据。短语结构句法分析介于依存句法分析和深层文法句法分析之间。
    (3)第三个层面:语义分析
    语义分析的最终目的是理解句子表达的真是语义。但是,语义应该采用什么表示形式一直困扰着研究者们,至今这个问题也没有一个统一的答案。语义角色标注(semantic role labeling)是目前比较成熟的浅层语义分析技术。语义角色标注一般都在句法分析的基础上完成,句法结构对于语义角色标注的性能至关重要。基于逻辑表达的语义分析也得到学术界的长期关注。出于机器学习模型复杂度、效率的考虑,自然语言处理系统通常采用级联的方式,即分词、词性标注、句法分析、语义分析分别训练模型。实际使用时,给定输入句子,逐一使用各个模块进行分析,最终得到所有结果。
    近年来,随着研究工作的深人,研究者们提出了很多有效的联合模型,将多个任务联合学习和解码,如分词词性联合、词性句法联合、分词词性句法联合句法语义联合等。联合模型通常都可以显著提高分析质量,原因在于联合模型可以让相互关联的多个任务互相帮助,同时对于任何单任务而言,人工标注的信息也更多了。然而,联合模型的复杂度更高,速度也更慢。

    三、总结

    自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。因此,自然语言处理是与人机交互的领域有关的。在自然语言处理面临很多挑战,包括自然语言理解,因此,自然语言处理涉及人机交互的面积。在NLP诸多挑战涉及自然语言理解,即计算机源于人为或自然语言输入的意思,和其他涉及到自然语言生成。
    现代NLP算法是基于机器学习,特别是统计机器学习。机器学习范式是不同于一般之前的尝试语言处理。语言处理任务的实现,通常涉及直接用手的大套规则编码。
    许多不同类的机器学习算法已应用于自然语言处理任务。这些算法的输入是一大组从输入数据生成的“特征”。一些最早使用的算法,如决策树,产生硬的if-then规则类似于手写的规则,是再普通的系统体系。然而,越来越多的研究集中于统计模型,这使得基于附加实数值的权重,每个输入要素柔软,概率的决策。此类模型具有能够表达许多不同的可能的答案,而不是只有一个相对的确定性,产生更可靠的结果时,这种模型被包括作为较大系统的一个组成部分的优点。
    自然语言处理研究逐渐从词汇语义成分的语义转移,进一步的,叙事的理解。然而人类水平的自然语言处理,是一个人工智能完全问题。它是相当于解决中央的人工智能问题使计算机和人一样聪明,或强大的AI。自然语言处理的未来一般也因此密切结合人工智能发展。
    这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
     

     
    在这里插入图片描述

    展开全文
  • 中文的NLP

    千次阅读 2019-03-25 09:22:37
    NLP(Natural Language Processing,自然语言处理)是研究实现人与计算机之间用自然语言进行有效通信的各种理论和方法,也是AI领域中一个最重要、最艰难的方向。近些年,NLP在中文分词、词性标注、词汇语义、句法解析...

    https://www.toutiao.com/a6671611871121900043/

     

    中文的NLP

     

    NLP(Natural Language Processing,自然语言处理)是研究实现人与计算机之间用自然语言进行有效通信的各种理论和方法,也是AI领域中一个最重要、最艰难的方向。近些年,NLP在中文分词、词性标注、词汇语义、句法解析方面均获得了很大的突破。大量的技术都应用于商业实践,并在商业领域获得了良好的市场和经济效益。文本方面主要有:基于自然语言理解的智能搜索引擎和智能检索、智能机器翻译、自动摘要与文本综合、文本分类与文件整理、自动阅卷系统、信息过滤与垃圾邮件处理、文学研究与古文研究、语法校对、文本数据挖掘与智能决策、基于自然语言的计算机程序设计等。语音方面主要有:机器同声传译、智能客户服务、聊天机器人、语音挖掘与多媒体挖掘、多媒体信息提取与文本转化、对残疾人智能帮助系统等。

    大部分自然语言处理内容都是英文为基础,大多数人先是学好了英语的处理,回头来再处理中文,却发现有很大的不同,这样不仅让中文自然语言处理学习者走了弯路,也浪费了大量时间和精力。中文的处理比英文复杂的多,网上中文相关资料少之又少,国内纯中文自然语言处理书籍只有理论方面的,却在实战方面比较空缺,这让中文自然语言处理的学习者感到举步维艰,很难下笔。

    中文的NLP

     

    总体来说,NLP的主要任务已经跨越对词的研究,发展道了对句子研究即句法、句义及句子生成的研究,已经能够解决句子层面的问题,但还未达到完全解决篇章层面的问题。在语法解释层面,大规模高精度的中文分词、词性标注系统基本已经达到商用要求,再句法解析方面还存在精度问题;而在语义解析(尤其是中文),命名实体识别、语义快都已经获得了较高的精度。AI形成了一整套的知识库的架构和推理体系,实现句子道知识库的主要方法是语义角色标注系统,但在整句的理解层面,语义角色标注系统的精度严重依赖于句法解析系统,这使系统商用化还有一段距离,产生的距离才是我们在这个领域研究突破的方向。

    中文的NLP

    展开全文
  • Python自然语言处理-BERT模型实战

    千人学习 2020-06-24 14:19:22
    Python自然语言处理-BERT模型实战课程旨在帮助同学们快速掌握当下NLP领域最核心的算法模型BERT的原理构造与应用实例。通俗讲解BERT模型中所涉及的核心知识点(Transformer,self-attention等),基于google开源BERT...
  • 文本分类是NLP领域的较为容易的入门问题,本文记录文本分类任务的基本流程,大部分操作使用了torch和torchtext两个库。1. 文本数据预处理首先数据存储在三个csv文件中,分别是...

    文本分类是NLP领域的较为容易的入门问题,本文记录文本分类任务的基本流程,大部分操作使用了torchtorchtext两个库。

    1. 文本数据预处理

    首先数据存储在三个csv文件中,分别是train.csv,valid.csv,test.csv,第一列存储的是文本数据,例如情感分类问题经常是用户的评论review,例如imdb或者amazon数据集。第二列是情感极性polarity,N分类问题的话就有N个值,假设值的范围是0~N-1。

    下面是很常见的文本预处理流程,英文文本的话不需要分词,直接按空格split就行了,这里只会主要说说第4点。

    1.去除非文本部分

    2.分词

    3.去除停用词

    4.对英文单词进行词干提取(stemming)和词型还原(lemmatization)

    5.转为小写

    6.特征处理

    Bag of WordsTf-idfN-gramWord2vec词干提取和词型还原

    from nltk.stem import SnowballStemmer
    stemmer = SnowballStemmer("english") # 选择语言
    from nltk.stem import WordNetLemmatizer 
    wnl = WordNetLemmatizer()
    

    SnowballStemmer较为激进,转换有可能出现错误,这里较为推荐使用WordNetLemmatizer,它一般只在非常肯定的情况下才进行转换,否则会返回原来的单词。

    stemmer.stem('knives')
    # knive
    wnl.lemmatize('knives')
    # knife
    

    因为我没有系统学习和研究过NLTK的代码,所以就不在这里展开说了,有兴趣的可以自己去看NLTK源代码。

    2. 使用torchtext加载文本数据

    本节主要是用的模块是torchtext里的data模块,处理的数据同上一节所描述。

    首先定义一个tokenizer用来处理文本,比如分词,小写化,如果你已经根据上一节的词干提取和词型还原的方法处理过文本里的每一个单词后可以直接分词就够了。

    tokenize = lambda x: x.split()
    

    或者也可以更保险点,使用spacy库,不过就肯定更耗费时间了。

    import spacy
    
    
    spacy_en = spacy.load('en')
    def tokenizer(text):
        return [toke.text for toke in spacy_en.tokenizer(text)]
    

    然后要定义Field,至于Field是啥,你可以简单地把它理解为一个能够加载、预处理和存储文本数据和标签的对象。我们可以用它根据训练数据来建立词表,加载预训练的Glove词向量等等。

    def DataLoader():
        tokenize = lambda x: x.split()
            # 用户评论,include_lengths设为True是为了方便之后使用torch的pack_padded_sequence
        REVIEW = data.Field(sequential=True,tokenize=tokenize, include_lengths=True)
        # 情感极性
        POLARITY = data.LabelField(sequential=False, use_vocab=False, dtype = torch.long)
            # 假如train.csv文件并不是只有两列,比如1、3列是review和polarity,2列是我们不需要的数据,
        # 那么就要添加一个全是None的元组, fields列表存储的Field的顺序必须和csv文件中每一列的顺序对应,
        # 否则review可能就加载到polarity Field里去了
        fields = [('review', REVIEW), (None, None), ('polarity', POLARITY)]
    
    
        # 加载train,valid,test数据
        train_data, valid_data, test_data = data.TabularDataset.splits(
                                        path = 'amazon',
                                        train = 'train.csv',
                                                                      validation = 'valid.csv',
                                                                      test = 'test.csv',
                                        format = 'csv',
                                        fields = fields,
                                        skip_header = False # 是否跳过文件的第一行
        )
        return REVIEW, POLARITY, train_data
    

    加载完数据可以开始建词表。如果本地没有预训练的词向量文件,在运行下面的代码时会自动下载到当前文件夹下的'.vector_cache'文件夹内,如果本地已经下好了,可以用Vectors指定文件名name,路径cache,还可以使用Glove。

    from torchtext.vocab import Vectors, Glove
    import torch
    
    
    REVIEW, POLARITY, train_data = DataLoader()
    # vectors = Vectors(name='glove.6B.300d.txt', cache='.vector_cache')
    REVIEW.build_vocab(train_data, # 建词表是用训练集建,不要用验证集和测试集
                      max_size=400000, # 单词表容量
                      vectors='glove.6B.300d', # 还有'glove.840B.300d'已经很多可以选
                      unk_init=torch.Tensor.normal_ # 初始化train_data中不存在预训练词向量词表中的单词
    )
    
    
    # print(REVIEW.vocab.freqs.most_common(20)) 数据集里最常出现的20个单词
    # print(REVIEW.vocab.itos[:10])                       列表 index to word
    # print(REVIEW.vocab.stoi)                               字典 word to index
    

    接着就是把预训练词向量加载到model的embedding weight里去了。

    
    
    pretrained_embeddings = REVIEW.vocab.vectors
    model.embedding.weight.data.copy_(pretrained_embeddings)
    UNK_IDX = REVIEW.vocab.stoi[REVIEW.unk_token]
    PAD_IDX = REVIEW.vocab.stoi[REVIEW.pad_token]
    # 因为预训练的权重的unk和pad的词向量不是在我们的数据集语料上训练得到的,所以最好置零
    model.embedding.weight.data[UNK_IDX] = torch.zeros(EMBEDDING_DIM)
    model.embedding.weight.data[PAD_IDX] = torch.zeros(EMBEDDING_DIM)
    

    然后用torchtext的迭代器来批量加载数据,torchtext.data里的BucketIterator非常好用,它可以把长度相近的文本数据尽量都放到一个batch里,这样最大程度地减少padding,数据就少了很多无意义的0,也减少了矩阵计算量,也许还能对最终准确度有帮助(误)?

    sort_within_batch设为True的话,一个batch内的数据就会按sort_key的排列规则降序排列,sort_key是排列的规则,这里使用的是review的长度,即每条用户评论所包含的单词数量。

    train_iterator, valid_iterator, test_iterator = data.BucketIterator.splits(
                                                    (train_data, valid_data, test_data),
                                                    batch_size=32,
                                                    sort_within_batch=True,
                                                    sort_key = lambda x:len(x.review),
                                                    device=torch.device('cpu'))
    

    最后就是加载数据喂给模型了。

    for batch in train_iterator:
      # 因为REVIEW Field的inclue_lengths为True,所以还会包含一个句子长度的Tensor
      review, review_len = batch.review  
      # review.size = (seq_length, batch_size) , review_len.size = (batch_size, )
      polarity = batch.polarity
      # polarity.size = (batch_size, )
      predictions = model(review, review_lengths)
      loss = criterion(predictions, polarity) # criterion = nn.CrossEntropyLoss()
    

    3. 使用pytorch写一个LSTM情感分类器

    下面是我简略写的一个模型,仅供参考

    import torch.nn as nn
    import torch.nn.functional as F
    from torch.nn.utils.rnn import pack_padded_sequence
    import torch
    
    
    
    
    class LSTM(nn.Module):
    
    
        def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim,
                     n_layers, bidirectional, dropout, pad_idx):
            super(LSTM, self).__init__()
            self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=pad_idx)
            self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=n_layers,
                                bidirectional=bidirectional, dropout=dropout)
            self.Ws = nn.Parameter(torch.Tensor(hidden_dim, output_dim))
            self.bs = nn.Parameter(torch.zeros((output_dim, )))
            nn.init.uniform_(self.Ws, -0.1, 0.1)
            nn.init.uniform_(self.bs, -0.1, 0.1)
            self.dropout = nn.Dropout(p=0.5)
    
    
        def forward(self, x, x_len):
            x = self.embedding(x)
            x = pack_padded_sequence(x, x_len)
            H, (h_n, c_n) = self.lstm(x)
            h_n = self.dropout(h_n)
            h_n = torch.squeeze(h_n)
            res = torch.matmul(h_n, self.Ws) + self.bs
            y = F.softmax(res, dim=1)
            # y.size(batch_size, output_dim)
            return y
    

    训练函数

    def train(model, iterator, optimizer, criterion):
        epoch_loss = 0
        num_sample = 0
        correct = 0
    
    
        model.train()
        for batch in iterator:
            optimizer.zero_grad()
            review, review_lengths = batch.review
            polarity = batch.polarity
            predictions = model(review, review_lengths)
            correct += torch.sum(torch.argmax(preds, dim=1) == polarity)
            loss = criterion(predictions, polarity)
            loss.backward()
            epoch_loss += loss.item()
            num_sample += len(batch)
            optimizer.step()
    
    
        return epoch_loss / num_sample, correct.float() / num_sample
    
    
    if __name__ == '__main__':
        for epoch in range(N_EPOCHS):
        train_loss, acc = train(model, train_iter, optimizer, criterion)
        print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {acc* 100:.2f}%')
    

    4. 注意事项和遇到的一些坑

    1.文本情感分类需不需要去除停用词?

    应该是不用的,否则acc有可能下降。

    2.data.TabularDataset.splits虽然好用,但是如果你只想加载训练集,这时候如果直接不给validation和test参数赋值,那么其他代码和原来一样,比如这样

       train_data = data.TabularDataset.splits(
                                           path = '',
                                           train = 'train.csv',
                                           format = 'csv',
                                           fields = fields,
                                           skip_header = False # 是否跳过文件的第一行
       )
    

    那么底下你一定会报错,因为data.TabularDataset.splits返回的是一个元组,也就是如果是训练验证测试三个文件都给了函数,就返回(train_data, valid_data, test_data),这时候你用三个变量去接受函数返回值当然没问题,元组会自动拆包。

    当只给函数一个文件train.csv时,函数返回的是(train_data)而非train_data,因此正确的写法应该如下

       train_data = data.TabularDataset.splits(
                                           path = '',
                                           train = 'train.csv',
                                           format = 'csv',
                                           fields = fields,
                                           skip_header = False # 是否跳过文件的第一行
       )[0] # 注意这里的切片,选择元组的第一个也是唯一一个元素赋给train_data
    

    3.同理data.BucketIterator.splits也有相同的问题,它不但返回的是元组,它的参数datasets要求也是以元组形式,即(train_data, valid_data, test_data)进行赋值,否则在下面的运行中也会出现各种各样奇怪的问题。

    如果你要生成两个及以上的迭代器,那么没问题,直接照上面写就完事了。

    如果你只要生成train_iterator,那么正确的写法应该是下面这样

       train_iter = data.BucketIterator(
                   train_data,
                   batch_size=32,
                   sort_key=lambda x:len(x.review),
                   sort_within_batch=True,
                   shuffle=True # 训练集需要shuffle,但因为验证测试集不需要
                                                      # 可以生成验证和测试集的迭代器直接用data.iterator.Iterator类就足够了
       )
    

    4.出现的问题 x = pack_padded_sequence(x, x_len) 当数据集有长度为0的句子时, 就会后面报错

    5.当vocab size较大而训练数据不多的情况下,我在实验时发现Adagrad效果比Adam好,如果数据较多,可以尝试使用RMSProp和Adam

    5. 总结

    不仅仅是NLP领域,在各大顶会中,越来越多的学者选择使用Pytorch而非TensorFlow,主要原因就是因为它的易用性,torchtext和pytorch搭配起来是非常方便的NLP工具,可以大大缩短文本预处理,加载数据的时间。

    我本人之前用过tf 1.x以及keras,最终拥抱了Pytorch,也是因为它与Numpy极其类似的用法,更Pythonic的代码,清晰的源码让我在遇到bug时能一步一步找到问题所在,动态图让人能随时看到输出的Tensor的全部信息,这些都是Pytorch的优势。

    现在tf 2.0也在不断改进,有人称tf越来越像pytorch了,其实pytorch也在不断向tf学习,在工业界,tf仍然处于王者地位,不知道未来pytorch能不能在工业界也与tf平分秋色,甚至更胜一筹呢?

    备注:公众号菜单包含了整理了一本AI小抄非常适合在通勤路上用学习

    往期精彩回顾
    
    
    
    
    适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)备注:加入本站微信群或者qq群,请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”
    

    喜欢文章,点个在看

    展开全文
  • NLP领域短文本分类非常的常见,那么我们今天分享一下NLP领域文本主要的应用场景
  • 使用Pytorch实现NLP深度学习

    千次阅读 多人点赞 2020-07-20 00:27:57
    原文链接:https://pytorch.org/tutorials/beginner/deep_learning_nlp_tutorial.html 本文将会帮助你了解使用Pytorch进行深度学习编程的关键思想。一些章节内容(计算图和梯度)不是Pytorch所特有的,而是所有深度...
  • 使用pytorch和torchtext进行文本分类

    千次阅读 2020-08-11 14:19:57
    文本分类是NLP领域的较为容易的入门问题,本文记录我自己在做文本分类任务以及复现相关论文时的基本流程,绝大部分操作都使用了torch和torchtext两个库。 1. 文本数据预处理 首先数据存储在三个csv文件中,分别是...
  • 点击上方,选择星标或置顶,不定期资源大放送!阅读大概需要15分钟Follow小博主,每天更新前沿干货来自 |知乎地址 | https://zhuanlan.zhihu.com/p/73...
  • 文本分类概述(nlp

    万次阅读 多人点赞 2018-11-25 19:04:02
    文本分类问题:给定文档p(可能含有标题t),将文档分类为n个类别中的一个或多个 文本分类应用:常见的有垃圾邮件识别,情感分析 ...致力让读者明白在处理文本分类问题时应该从什么方向入手,重...
  • (一)NLP基础知识

    万次阅读 2018-05-24 16:46:15
    一种流行的自然语言处理库、自带语料库、具有分类,分词等很多功能,国外使用者居多,类似中文的jieba处理库 2、文本处理流程 3、分词 英文用NLTK,中文用jieba等,比较难处理时候,可能得借助正则表达式。 4...
  • NLP ---文本情感分析

    万次阅读 多人点赞 2019-01-03 10:34:46
    前面几节我们详细的研究了文本分析的相关算法,本节将简单介绍一下基于文本的情感分析方面的内容,本节更多是论述方面的内容,这个方向的算法基本都是我们前面...文本情感分析(Sentiment Analysis)是指利用自然语言...
  • 什么是NLP

    千次阅读 2019-07-05 15:19:20
    自然语言处理 - 知乎 https://www.zhihu.com/topic/19560026/intro
  • 国内大陆部分主要NLP团队

    千次阅读 2019-05-25 19:22:29
    微软亚洲研究院自然语言计算组...清华大学自然语言处理与社会人文计算实验室http://nlp.csai.tsinghua.edu.cn/site2/ 清华大学智能技术与系统信息检索组http://www.thuir.cn/cms/ ...
  • 自然语言处理NLP)- 建立一个搜索引擎(信息检索系统)的点点滴滴 教程在最底下 代码: 建索引:   搜索:                       bensonrachel简书教程...
  • 60分钟带你学习PyTorch框架。

    千人学习 2020-03-11 14:39:34
    随着对于深度学习研究的逐渐深入,在自然语言处理领域,出现了很多深度学习的模型,这些模型相比于传统的机器学习方法,在准确率等指标上面有了很大的提高。本课程拟就深度学习在自然语言处理领域的应用,从基础开始...
  • NLP的四大基本任务

    千次阅读 2019-04-15 08:36:26
    1. 序列标注:分词/POS Tag/NER/语义标注 2. 分类任务:文本分类/情感计算 3. 句子关系判断:Entailment/QA/自然语言推理 4. 生成式任务:机器翻译/文本摘要
  • 1、自然语言处理圣经---《自然语言处理综论》2、视频课程《深度学习与自然语言处理-2018》3、Natural Language Processing (NLP)4、吴恩达经典课程 - Machine Learning —Coursera5、斯坦福 Natural Language ...
  • R语言安装NLP自然语言分析包

    千次阅读 2015-11-15 20:22:16
    1. 自然语言处理NLP)  对于英语体系,基于空格可以直接进行分词,而中文则不同,需要进行分词,然后进行后续处理。NLP是natural language processing的缩写,专指此类的工作。  自然语言处理包: Snowba
1 2 3 4 5 ... 20
收藏数 342,227
精华内容 136,890
关键字:

nlp