自然语言处理入门_labeledtrain_普通网友的博客-程序员宅基地

  自然语言处理NLP( natural language process)是这几年越来越火了,kaggle上的比赛有关NLP的也日渐多起来了.
  
  NLP的应用场景很多,情感分析,邮件过滤,ai客服,机器翻译等等等等,就像这几年越来越火有成为BAT之后第四极的今日头条,为什么能够为每个人推送不同的感兴趣的内容,这里少不了机器学习的功能,当然也包括NLP.
  
  想入门NLP,上网一搜,搜到的多是些具体算法的讲解,或者某些框架的使用,要么就是上来就一顿推荐看某某书某某论文或者讲义.从个人经验的角度来讲,这种方法其实不适合大多数人,因为在初期,学的东西枯燥无味又过于细节,又没有即时的反馈,学习热情很容易就消减了.
  
  初期的时候对要学习的东西的整体概况,框架全貌,基本流程,有个基本了解,然后快速上手,再慢慢地去填充细节.这里强推数学之美,google一下蛮容易下载到的.即便你对机器学习都一无所知,这本书的大部分内容应该也能看懂.这本书会让你对机器学习,自然语言处理的一些基础原理有个大概的了解.
  
  说回NLP,早期的时候发展的其实并不好.最早的时候分为两个派别,一派是语法语义分析派,一派是统计学派.
  
  举个简单的例子,以分析"我爱北京天安门"为例
  
  前者的思路是分析出"这是一个主谓宾结构,主语是‘我’,谓语是‘爱’,宾语是‘北京天安门’",我知道‘爱’是什么意思,知道‘北京天安门’是个地名.那么这句表达的意思也就知道了.
  
  后者的思路是从大量的文本中找出相似的句子,比如我事先人工搜集了1000个文本,我们人工分析出“我爱xxx,我喜欢xxx,去北京天安门”等等类似的文本,人工标注这些文本,知道这种句子表达的是一种正面的情绪,表达喜欢某个人/地点/事物等. 那么我通过比较,就知道了“我爱北京天安门”表达的意思大概率也是我喜欢某个地方,这个地方叫天安门.
  
  早期的时候语法分析派发展的比较好,但是很快就遇到了瓶颈,因为语法太TM复杂了,词的二义性也很多,根本分析不明白.统计学派发展的不好,很好理解,以这种思路来做NLP,势必要对语料库(也就是上面例子里的那1000个文本)的数量有要求,数量越多越好,早期的时候是没有这种条件的.随着计算机的发展,数据量的增长,统计学派越来越体现出其优势,这就是我们今天的NLP处理的思路:根据大量的已有的文本(语料库),基于统计学,基于概率,去推测待预测文本的最大可能的含义.
  
  如果上面这个"我爱天安门"的例子让你困惑,不要怀疑自己,一定是我的例子举得还不够好,再一次建议去看看数学之美.可以看看第二章:从规则到统计.
  
  书归正传:
  
  NLP笼统地说:可以分为4个部分
  
  文本清洗
  
  分词
  
  word2vec
  
  上算法对文本做分析
  
  拿到一个文本,首先要做清洗,比如你用爬虫爬一个电影评论,你爬下来的内容是html格式的,其中你真正要的可能就是评论的部分,那你可能会用到beatifulsoup这个库,用python写过爬虫的应该很熟悉了.
  
  好,现在我们拿到干净的文本了,我们要把词分割出来,比如"我爱北京天安门",要分割出我,爱,北京,天安门这几个词.英文的分词好分一点,因为词和词之间有空格.这一步我们通常也是用现成的工具,英文就nltk,中文就结巴分词.都挺有名的.
  
  好,现在我们已经拿到一堆一堆的词了,我们要把这些词转换成相应的向量,用向量表示出来.我们用一个例子来说明这一步做的是什么.
  
  >>> from sklearn.feature_extraction.text import CountVectorizer
  
  >>> corpus = [
  
  ...     'This is the first document.',
  
  ...     'This document is the second document.',
  
  ...     'And this is the third one.',
  
  ...     'Is this the first document?',
  
  ... ]
  
  >>> vectorizer = CountVectorizer()
  
  >>> X = vectorizer.fit_transform(corpus)
  
  >>> print(vectorizer.get_feature_names())
  
  ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
  
  >>> print(X.toarray())
  
  [[0 1 1 1 0 0 1 0 1]
  
  [0 2 0 1 0 1 1 0 1]
  
  [1 0 0 1 1 0 1 1 1]
  
  [0 1 1 1 0 0 1 0 1]]
  
  可以看到我们先统计出文本中有几种词,比如上面例子.corpus中一共涉及到  ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']这9种词,那么我们就把每一句话都转化为一个9个特征的样本,其中特征的值就是该特征出现的次数.比如第二句中document出现了两次,is一次,second一次.....,那么第二句的向量化表示就是[0 2 0 1 0 1 1 0 1]。这就是所谓的词频TF:Term Frequency.
  
  但是,问题来了!
  
  考虑这样一个句子:"我想你,我喜欢你,我爱你,我要向你求婚!",分完词以后,得到我/你/爱/喜欢/想/求婚.  ‘我’,‘你’出现了很多次,但你能说这句话的重点在‘我’‘你’吗?这句的重点明显在‘爱’‘求婚’.
  
  知识点来了:TF-IDF是Term Frequency -  Inverse Document Frequency的缩写,即“词频-逆文本频率”
  
  概括来讲, IDF用来反映词的重要性.IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低。比如上面例子里,‘我’‘你’重复了太多遍,你可以理解为表白的人废话有点多.所以‘我’,‘你’的IDF就低,‘求婚’的IDF更高.
  
  下面给出IDF和TF-IDF的计算公式:
  
  IDF(x)=logN+1N(x)+1+1
  
  IDF(x)=logN+1N(x)+1+1
  
  TF−IDF(x)=TF(x)∗IDF(x)
  
  TF−IDF(x)=TF(x)∗IDF(x)
  
  其中,N代表语料库中文本的总数,而N(x)代表语料库中包含词xx的文本总数。TF(x)指词xx在当前文本中的词频.
  
  stackoverflow上关于sklean中具体计算tf-idf的过程的回答详情请戳这里.   sklearn的官方文档戳这里  以上两个link有兴趣可以看看.
  
  好,到了这一步,文本数据就已经被我们转换为M*N的矩阵了.代表M个文本. 下面就该上什么算法就上什么算法吧.
  
  说了这么多,来实战看看吧.完整代码戳这里.
  
  关于kaggle上这个比赛的描述及数据下载具体见这里. 这边我简单介绍一下,labeledTrainData.tsv里记录了各种电影评论,已经标明了是正面的评价还是负面的,testData.tsv里记录了各种评论,我们需要根据这些评论去判断这是一个正面的还是负面的评价.
  
  1.文本清洗,分词
  
  复制代码
  
  import re
  
  from bs4 import BeautifulSoup
  
  def review_to_wordlist(review):
  
  '''
  
  Meant for converting each of the IMDB reviews into a list of words.
  
  '''
  
  # First remove the HTML.
  
  review_text = BeautifulSoup(review).get_text()
  
  # Use regular expressions to only include words.
  
  review_text = re.sub("[^a-zA-Z]"," ", review_text)
  
  # Convert words to lower case and split them into separate words.
  
  words = review_text.lower(www.gouyiflb.cn).split()
  
  # Return a list of words
  
  return(words)
  
  traindata = []
  
  for i in range(0,len(train['review'])):
  
  traindata.append(" ".join(review_www.mcyllpt.com_wordlist(train['review'][i])))
  
  testdata = []
  
  for i in range(0,len(test['review'])):
  
  testdata.append(" ".join(review_www.thd178.com to_wordlist(test['review'][i])))
  
  复制代码
  
  2.词的向量化word2vec
  
  这里,我们没有使用大名鼎鼎的google的word2vec库,我们就用sklearn中的TfidfVectorizer
  
  复制代码
  
  from sklearn.feature_extraction.text import TfidfVectorizer
  
  tfv = TfidfVectorizer(stop_words = 'english')
  
  X_all = traindata + testdata
  
  tfv.fit(X_all)
  
  X_all = tfv.transform(X_all)
  
  复制代码
  
  这里涉及到一个stopwords的概念,即有些词我们认为对我们理解语义是无关紧要的,比如英文里的the,to 中文里的的地得...这种词我们就叫做stopwords,在做向量化的时候我们不管这些词.
  
  3.采用逻辑回归 做模型训练
  
  复制代码
  
  from sklearn.linear_model import LogisticRegression
  
  log_reg = LogisticRegression()
  
  log_reg.fit(X_train,y_train)
  
  predict_result = log_reg.predict(X_test)
  
  result_df = pd.DataFrame(data= www.tygj178.com{"www.michenggw.com id":test["id"], "sentiment":predict_result})
  
  result_df.to_csv("log_reg.csv",index=False)
  
  复制代码
  
  最终我们取得了0.88的准确率.
  
  总结一下:
  
  你需要一个学习环境.  建议直接安装anaconda。已经帮你装好了大部分你可能用到的机器学习包.
  
  python   python语法需要有基本了解.不会的话就搜一搜吧,网上教程大把.对于有编程基础的朋友,入门很容易.
  
  pandas/numpy用法要有个基本了解.可以跟着https://www.kaggle.com/learn/overview学习.
  
  sklearn  在刚开始的时候可以先不用太注重各种算法背后的原理.先学着用起来.等能入门了以后,再不断深化自己对各种算法的理解,这样才能更好地选择合适的算法,合适的参数.
  
  去kaggle找些比赛动起手来,实战起来.
  
  以上就是机器学习快速入门的学习路径,结合本文说的内容,也就算是nlp的快速入门的内容了,希望能帮到大家.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/li123128/article/details/85235777

智能推荐

Axure的全局变量_axcure全局变量-程序员宅基地

在Axure中,变量是Axure中临时储存数据的容器,变量包括全局变量和局部变量。全局变量能够在Axure原型的所有页面的用例中对其进行操作。下面以一个简单的搜索功能例子来介绍全局变量_axcure全局变量

android 驱动开发书籍_手机驱动开发参考书-程序员宅基地

http://www.jb51.net/books/60595.html#down_手机驱动开发参考书

基于飞凌iMX6UL的SD卡制作、uboot烧写、NAND启动_烧写uboot.bin和烧写uboot.imx-程序员宅基地

imx6ulSD卡制作、烧写、NAND启动合理的创建标题,有助于目录的生成直接输入1次#,并按下space后,将生成1级标题。输入2次#,并按下space后,将生成2级标题。以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。如何改变文本的样式强调文本 强调文本加粗文本 加粗文本标记文本删除文本引用文本H2O is是液体。210 运算结果是 1024...._烧写uboot.bin和烧写uboot.imx

Azure cache 的配置与应用-程序员宅基地

最近公司的项目要是用cloud Service 所以研究了下 Azure cache 的配置与使用。首先创建项目第二步 配置 cache worker role(1) 点击 cache worker role 项目的属性设置。(2)属性Caching 设置第三步 添加代码到web项目的web.config配置文件(identifier应该是Cach...

js中实现深拷贝的4种方法_js 深拷贝-程序员宅基地

js中深拷贝的方法原生js中递归函数拷贝将数据中所有的数据拷贝下来,对拷贝之后的数据进行修改不会影响到原数据 ,两个对象或数组不共享一块内存 <script> let obj={ abc:'123', def:[{a:1,b:2,c:3},{q:8,w:9}], qwe:{e:4,f:5} } //需求将obj这个对象拷贝出一个新对象修改新对象的值不会影响原对象的值 //定义一个函数 functio_js 深拷贝

树莓派玩机笔记(二)-程序员宅基地

每次调试树莓派都需要连接电视HDMI,很不方便。东哥决定去网上淘一根USB转TTL线,直接把屏幕,键盘,鼠标,都省了,直接用串口登陆,巴适得很啊哈哈。这是东哥购买USB转TTL线淘宝店铺地址,真不是做个广告,亲测可用。http://item.taobao.com首先安装驱动因为东哥以前安装过,USB转RS232的驱动,所以安装的时候一直报错,卸载重新安装能够..._电视 hdmi 调试 ttl

随便推点

linux安装openssl-程序员宅基地

sudo apt-get install opensslsudo apt-get install libssl-devRedHat、centos才是openssl-devel

L1范数与L2范数的区别与联系_l1范数和l2范数_机器学习我也学的博客-程序员宅基地

L1范数与L2范数的区别与联系本文转自添加链接描述,感谢原创作者!目录L1范数与L2范数的区别与联系一、过拟合与正则化二、L1范数与L2范数三、从几何角度直观理解L1范数、L2范数参考链接:一、过拟合与正则化过拟合指的就是在机器学习模型训练过程中把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样会导致在测试的时候不能够很好地识别数据,即不能正确的分类,模型测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力较差,也就是高方差(variance),低偏差(bias)。例如:  正_l1范数和l2范数

linuxmint安装开发工具_LinuxMint/Ubuntu装机必备实用小软件 | 薄荷开源网-程序员宅基地

其实,本文算是对以前一些零散文章(包括在网易博客写的)的一个小结。LinuxMint可谓“开箱即用”操作系统的典范,安装之后无需过多调整设置,即可进行使用。但是,并不意味着不需要那些随手可得的优秀工具。工欲善其事,必先利其器。在薄荷开源网小编使用LinuxMint/Ubuntu的过程中,所喜欢的一些小工具,都是经过实践反复检验的好软件。推荐出来,希望对新手朋友有所助益。以下工具软件,都是系统软件源..._mint工具

Python3模块numpy的安装过程-程序员宅基地

numpy的安装过程:要进入下面这个网站,好像不翻墙的话还不行,只有翻了墙,才能自动打开http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy知乎网友提示:为了能够安装wheel文件,你需要首先安装wheel这个包。进到cmd里面输入pip install wheel,我已经按照这个要求操作成功了老师说如果直接在cmd里面pip

安装ceston8出现timeout_linux下使用anocanda安装superset趟坑实践-程序员宅基地

版本列表: python 3.6 superset 0.28.11.安装Anaconda虚拟环境 访问anaconda官网,进入产品页https://www.anaconda.com/products/individual ,点击download按钮,选择自己的操作系统,下载相应的安装包 由于我是在linux上安装,故下载linux对应版本即可下载对应的an...

关于MYSQL的索引知识-程序员宅基地

一、什么是索引索引在MYSQL中也叫做 “键(key)”,是存储引擎用于快速找到记录的一个数据结构。要理解MYSQL中索引是如何工作的,最简单的方法就是去看一本书的“索引”部分,如果想在一本书中找到某个特定的主题,一般会看书的“索引”,找到对应的页码。把表当作一本书的话,索引就相当于这本书的目录,建立索引就是创建目录,如果这本书的内容不是很多,就完全没有必要去建立目录--索引,因为索引它也是需...