1.NLP理论基础

1.NLTK


很多简单版本的wrapper就是用NLTK的内核,但是给他加了一个外衣,让他调用起来更加的简单,比如说Textbolb,这个库很是简单。

2.NLTK安装


3.安装语料库


NLTK本身是一套算法,对于自然语言处理来说,算法只是一部分。比如语料库和一些模型都还是没有被下载下来。那么就需要去安装他。

corpora

英 /'kɔːpərə/ 美 /'kɔrpərə/n. 任何事物之主体;全集n. (Corpora)人名;(意)科尔波拉

语料库

model

n. 模型;典型;模范;模特儿;样式vt. 模拟;塑造;模仿vi. 做模型;做模特儿adj. 模范的;作模型用的n. (Model)人名;(德、俄、英)莫德尔

4.功能一览表


介绍的是NLTK中都有哪些功能。

5.NLTK自带语料库

什么叫做语料库呢?对于自然语言来讲,语料就是活命的根本,因为计算机本身是不认识这些语言的。理论上他需要多看多学,看到这些语料之后,他才能知道这句话是代表什么意思,这句话可以做什么分类,或者这两句话是否有相似性。为了让机器可以好好的学习到这些东西,你需要给他喂一些语料,所以NLTK里面会自带一个corpus的东西,就是一个语料库的集合,下载下来,就可以导入比如说brown语料库(布朗大学搞的一个语料库),把文章做好标题分类。

如果import的时候,碰上inport error,就是说你没有下完哪个语料库,这个时候,你可以在这一段代码的前面加上nltk.download('放入你需要下载的东西')。如果你不希望全部下载,你可以在你需要的时候,进行下载的时候写上download,因为这一步,如果那个文件存在的话,他就不会在下载了,所以也不会伤害你很多的运算时间,加上这一步以防万一。

#里面有很多的语料库,布朗语料

from nltk.corpus import brown

#n. 类别(category的复数)分类

print(brown.categories())

#.sents代表句子有多少

print(len(brown.sents()))

#.words代表有多少个单词

print(len(brown.words()))

6.文件的处理流程

文本处理的流程是这个样子的,我有一句话,我要进行一个叫做预处理的过程:

预处理中包含很多流程,其中一个叫做Tokenize,简称分词,分词就是把句子分开,分成每一个单独的小块,在计算机的存储里面代表一个位置。比如:"hello"占了一个位置...,因为计算机本身是不认识语言的,更不认识中英文,什么都不懂。

分完词以后,你只要告诉他"hello"和"from"是两个不同的东西,对他而言只不过是用了不同的位置,存了两个不同的东西而已,之后那些,像特征工程处理,对于任何的语言都是一样的。经过一系列的预处理之后,你会得到"A01","B02"...这样的表达式,来表达你上面的原本你输入的哪个句子。这就是预处理要做的事情,就是把人理解的一些文本变成最终计算机能够看得懂的表达式,这些表达式表达的位置或者是gram的名字,创造一些不同的特征,简单来说就是把它表示成用数字表达的东西,最后可能每个单词就代表一个位置在你的存储器里面,但在存储器占了一个位置,并没有代表实际复杂的意思,如果要使用ML的话,你需要把这些存储器里面的东西变成一个数字(计算机可以理解的数字,让他可以进行加减运算),这就是特征工程。特征工程就是把我们已知的这些东西,转化成可以让计算机所理解所计算的数字。然后得到的数值放入ML中就OK了。

第一个部分Tokenize(分词)

中文和英文在处理的时候唯一不同的一点,就是说把长句子拆成"有意义"的小部件。那要怎么去拆呢?

先看看英文怎么去分词:分成一个词的列表,词列表,把你句子中有意义的部件都给分裂开来,存成数组中的每一个元素。分成了一个list of words[词列表],这个词列表就是把有意义的部件都给分裂开来,存储数组中的每一个元素。

import nltk

sentence = "hello,world"

tokens = nltk.word_tokenize(sentence)

print(tokens)

"""['hello', ',', 'world']"""

中文和英文有很大的不同:中文的中间没有空格,


对于中文来说,"今天天气不错"是连在一起的,中间是没有空格的,如果我们想把它分开来,就不能像英文那样使用空格来进行划分。

中文的的分词有两种:

1.启发式。对照字典表,有一个字典,对照你的那句话,看"今"是一个单词吗,不是,那"今天"是一个单词吗?是的,再看"今天天"是一个单词吗?不是,"今天天气"是一个单词吗?不是。都看完以后,最长的哪个"今天"会被拿下来,作为分词中的一个部分。然后看"天"是一个单词吗?不是。"天气"是一个单词吗?是。"天气不"是一个单词吗?不是。"天气不错"也不是一个单词。所以"天气"会被作为一块,而"不错"也会作为一块的。类似一种字典查找,贪婪算法那样寻找最长的拟合词。

2.机器学习/统计方法。coreNLP支持三种语言(英文、西班牙语)。

我们汉字中每一个词对应着英文里面的每一个字母。

那怎么去尝试去做中文分词呢?可以尝试使用jieba(也是一个库)的东西:


全模式:把所有可能出现的单词都给分出来。

精确模式:我只把这句话分成可以分成的单词。

新词识别:默认是精确模式,把一些新词给识别出来。

搜索引擎模式:把这句话中可搜的关键词都给搞出来,更加适用于搜索引擎使用。

分词之后的效果:

分词之后就可以进行下一步复杂的算法。

有时候并不是那么简单,比如在网络上的进行分词:



词性的变化,在中文中没有,但是在英文中稍微有一点问题。就是说词本身后面加上不同的分形,这还是要取决于任务的目标是什么。

那如何解决呢?

wordnet是大量的语言学家搞的大的语料网络。坏处就是要进行更新,有些新词是无法被弄出来的。

但是有一个小小的问题(在英语中会出现的问题)


告诉我们算法的词性是什么。默认是名词词性。

标准的预处理流水线:

那什么是自然语言处理呢?就是把我们的自然语言,变成我们计算机可以处理的数据(0101011101...),怎么去做这一步呢?就是我们后面所说的特征工程。

那怎么去做呢?

这些特征值是怎么被计算出来的。依据不同的处理目标,你会有不同的需求。

1.情感分析


比如说你手上有一堆评论,你想知道这些评论的情感,

也是语言学家写出来的,把这些单词列表写出来,然后每一个后面都跟一个值。比如like正面程度是1,"good"的正面程度是2...基于关键词的打分机制。

另一个应用:文本相似度

如果用最原始的NLP处理方法的话,整个语料库里面所有的单词都列下来,他们各自有各自特殊的位置,我们可以用它单词出现的频率,来表达这个句子的特殊性。

比如说:我们有一个语料库,一共有三个句子,我这个vector的长度就是6这么长,里面会记录下我每一个单词出现的次数,比如说第一句话"we"出现了一次,"he"出现了三次,"happy"和"are"各一次,同理第二三句话。用出现的次数表示特征,形成vector,用这个来表示一句话。

这样做的好处就是,使得你所有的这些向量都是标准长度的,机器学习的那一部分就会很方便,否则,你还需要进行同等长度的判定处理,(不太靠谱,判定以后又有一些问题在里面)。

可以判断我的两个句子的相似性有多大,因为这个时候句子都变成一个vector,夹角越小,他的相似性就会越大

那在NLTK中怎么去使用呢?FreqDist是一个统计器。

那怎么去使用呢?

most_common(50)这句话会把你最常用的50个单词拿出来。


3.应用:文本分类

几乎所有的问题都会被抽话成文本分类。

比如"hi"出现了三次,我的句子一共有6个tokens,所以我的TF就是0.5。

而Inverse(inverse

n. 相反;倒转

adj. 相反的;倒转的

vt. 使倒转;使颠倒

),而IDF就是weight。下面是例子:

那如何在NLTK中实现这件事情呢?

TextCollection和FreqDist差不多,不同的是FreqDist只能处理一句话,而TextCollection是把整个文档都放进来。

接下来就用ML:

你可能感兴趣的:(1.NLP理论基础)