第8章 文本数据处理_第1页
第8章 文本数据处理_第2页
第8章 文本数据处理_第3页
第8章 文本数据处理_第4页
第8章 文本数据处理_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章文本数据处理8.1扩展与深化——不同种方式的文本数据处理8.2文本数据的优化处理8.3小结8.1扩展与深化——不同种方式的文本数据处理

在第五章中,我们利用sklearn库较为简单的介绍了一些关于文本数据处理的知识,例如CountVectorizer、N-Grams、Tf-IDF等等。这里我们将详细的对其介绍

在拿到一个文本数据并对其处理之前,我们首先要做的就是将其转换成机器能够看懂的机器语言。文字只是表达我们所说意思的载体,其所适用的对象仅限于我们人类。就比如,你拿着一段中国话,让一个从未见过或者听过中国话的外国人去看懂这段话所说的意思,这无非是强人所难。所以,在对文本数据进行处理之前,我们首先就要把文本翻译成机器能够看懂的机器语言。

那如何才能将文本数据翻译成机器语言呢?第一步肯定是要将文本进行分词,把一段话或者一句话中所要表达的主要意思提取出来。例如,“今天是星期一,我要去上学”这句话,进行完分词操作后将会是“今天”、“是”、“星期天”、“我”、“要去”“上学”。将一句话或者一段话,拆分成一个个基本单元,这就是我们分词操作。

在第五章中,对于英文文本,我们借助的是正则化进行分词,而对于中文文本,我们更多借助的是jieba进行分词操作。对于英文文本,我们虽然可以通过正则化对文本进行分词,但如何删去冗沉的停用词,变成了令我们头疼的操作。利用sklearn对英文文本进行分词使用正则化分词:importres=input()s=s.lower()s=re.sub(r'\,|\.','',s)s=re.sub(r'[0-9]','',s)s=re.split(r'\s+',s)使用sklearn自带的停止词库进行分词:fromsklearn.feature_extraction.textimportCountVectorizerimportres=input()s=re.sub(r'[0-9]','',s)s=re.split(r'\.|\,',s)vec=CountVectorizer(stop_words='english')tmp=vec.fit_transform(s)print(vec.get_feature_names())利用jieba对中文文本进行分词

上面两种方法是sklearn对英文文本的分词方法,我们可以很明显的感受到,使用sklearn自带的CountVectorizer来进行分词是优于正则化进行分词的。但是sklearn还有一个弊端就是不能对中文文本进行分词,需要加载额外的package来对其进行分词——jieba。Jieba作为python的第三方package,本身可以用python自带的pip进行安装和下载。Win+R键打开命令提示符,输入下面这行代码:pipinstalljieba

用Jieba进行分词,主要是利用了jieba的cut函数。cut主要有三种模式,一种是精确模式,另一种是全模式,剩下一种是搜索引擎模式。精确模式精确模式是在不影响文本大意的前提下,尽可能的将句子精确切开,此时cut的参数cut_all应为false。tmp=jieba.cut(l,cut_all=False)print("/".join(tmp))全模式全模式就是不考虑句子本身的意思,将句子尽可能的进行分词操作,此时cut参数中的cut_all应为true。tmp=jieba.cut(l,cut_all=True)print("/".join(tmp))搜索引擎模式搜索引擎模式是在精确模式的基础上,在对比较长的词语进行划分,以便提高分词的召回率,这也是常用在搜索引擎上的一种方法。tmp=jieba.cut_for_search(l)print("/".join(tmp))利用NLTK对文本进行分词

NLTK(NaturalLanguageToolkit)是一个自然语言处理工具包,在NLP领域中,也是最常使用的一个python库。这里我们就以英文文本为例,对NLTK库的使用进行讲解。至于如何对中文文本进行操作,这个作为一个提高性的内容,有需要的读者可以自行了解NLTK的安装Win+R键打开cmd(命令提示符),输入“pipinstallnltk”进行安装,安装完成后,打开你的pycharm输入下面一串代码:importnltknltk.download()然后下载所需的你所需的组件进行安装。NLTK较sklearn的分词方式,有着两大优势:一是NLTK支持整段文本句子化,利用sent_tokenize()来对整篇文章进行分句。二是NLTK支持段落直接分词,而不是先分成句子,然后再分词。利用sent_tokenizer()进行分句;fromnltk.tokenizeimportsent_tokenize,word_tokenizes=input()s=sent_tokenize(s)foriins:print("Sentence:",i)利用word_tokenizer()来进行分词:fromnltk.tokenizeimportword_tokenizes=input()s=word_tokenize(s)print(s)

这里,有读者可能会问到,为什么分完词之后那些标点符号还有一些无用的词语没有去掉呢?这里,就引申出了我们下面要讲的关于NLTK停止词的使用。NLTK停止词的使用关于什么是停止词,第五章里已经做了详细的介绍,如果忘了的读者可以翻到第五章自行查看。下面我们来学习关于NLTK停止词的使用。

由于NLTK内置了停用词表,我们可以在nltk.corups里来找到它并查看其组成:

{'because','over','until','has','ours','after','ourselves','in','any','won','being','against','does','no','them','myself','isn','ain','him','itself','which','can','by','for','between','be','below','me','and','these','its','we','with','again','once','it','having','o','don','this','out','own','your','an','hers','ma','but','up','there','if','have','how','just','our','a','ve','where','re','most','what','mightn','nor','herself','shan','too','was','from','am','to','as','such','very','wouldn','himself','then','are','under','m','while','through','should','their','themselves','few','of','other','mustn','both','the','each','my','some','she','that','than','only','he','now','same','so','wasn','didn','on','whom','t','hasn','not','d','were','yourselves','do','or','about','during','needn','yours','hadn','aren','s','yourself','couldn','they','at','weren','her','doesn','off','theirs','who','all','above','into','y','doing','why','ll','here','those','been','more','will','when','i','haven','his','did','you','before','shouldn','is','down','had','further'}共计153个停用词,如果有特殊需要的话,读者也可以自行添加停用词。接下来我们从文本中删除停用词fromnltk.corpusimportstopwordsfromnltk.tokenizeimportword_tokenizes=input()s=s.lower()stop_words=set(stopwords.words('english'))s=word_tokenize(s)tmp=[xforxinsifnotxinstop_words]m=[]forxintmp:ifxnotinstop_wordsandxnotinm:m.append(x)print("tmp:\n",tmp)print("m:\n",m)接着,我们只需要删除一些残留的标点符号即可。delete=[',','.',':',';']foriindelete:ifiinm:m.remove(i)print("m:\n",m)8.2文本数据的优化处理利用NLTK对文本数据进行优化处理在上一节中,我们利用NLTK进行了分词操作,将一整篇文本分成若干个独立的基本单元,但是这种简单的分词方式,也会出现一些问题,读者是否想到了呢?让我们来看下面一串代码:输入:“Ihaveabook,buthehastwobooks.”s=input()s=s.lower()stop_words=set(stopwords.words('english'))s=word_tokenize(s)tmp=[xforxinsifnotxinstop_words]m=[]forxintmp:ifxnotinstop_wordsandxnotinm:m.append(x)delete=[',','.',':',';']foriindelete:ifiinm:m.remove(i)print("m:\n",m)输出:m:['book','two','books']

看到这里读者是不是明白了呢?没错,“has”、“have”和“ate”、“eat”这两组单词其实是一个单词的不同种形式,“has”是“have”的第三人称形式,“books”是“book”的过去式。这里NLTK的分词默认他们是两个不同的单词,所以会出现上述的结果。针对这种情况,我们可以对已经分完词的列表m进行提取词干操作。什么是提取词干呢?顾名思义就是将一个英文单词的词干提取出来,例如“having”提取词干之后会变成“have”,“iamging”提取之后会变成“iamg”。我们可以利用NTLK.stem中的PorterStemmer进行词干提取fromnltk.stemimportPorterStemmerps=PorterStemmer()M=[]foriinm:if(ps.stem(i)notinM):M.append(ps.stem(i))print("M:\n",M)输出:M:['book','two']这里,由于“have”和“has”是停止词,所以在分词的时候会被过滤掉,因此我们也不必考虑“have”和“has”的关系。当然,NLTK.stem中的SnowballStemmer也可以进行提取词干fromnltk.stemimportSnowballStemmerss=SnowballStemmer('english')M=[]foriinm:if(ss.stem(i)notinM):M.append(ss.stem(i))print("M:\n",M)输出:M:['book','two']还可以用NLTK.stem.snowball中的EnglishStemmer来进行处理。fromnltk.stem.snowballimportEnglishStemmeres=EnglishStemmer()M=[]foriinm:if(es.stem(i)notinM):M.append(es.stem(i))print("M:\n",M)输出:M:['book','two']利用NLTK进行词性标注

现在我们已经了解了如何用NLTK进行分词、词干提取和筛选停用词,接下来就让我们学习如何利用NLTK进行词性标注。词性标注,就是给已经分完词的单词一个标签,这个标签就代表着这个单词的词形。就比如“cat”,我们就可以给它名词的标签(NN),标记“cat”是一个名词。词性标注的实现方法主要使用NLTK中的pos_tag importnltkfromnltk.corpusimportstopwordsfromnltk.tokenizeimportword_tokenizes=input()s=s.lower()top_words=set(stopwords.words('english'))s=word_tokenize(s)tmp=[xforxinsifnotxinstop_words]m=[]forxintmp:ifxnotinstop_wordsandxnotinm:m.append(x)delete=[',','.',':',';']foriindelete:ifiinm:m.remove(i)m=nltk.pos_tag(m)print(m)输出:[('life','NN'),('chess-board','JJ'),('world','NN'),('pieces','NNS'),('phenomena','VBP'),('universe','JJ'),('rules','NNS'),('game','NN'),('call','NN'),('laws','NNS'),('nature','VBP'),('player','NN'),('side','NN'),('hidden','VBD'),('us','PRP'),('know','VBP'),('play','VB'),('always','RB'),('fair','JJ'),('patient','NN'),('also','RB'),('cost','VBD'),('never','RB'),('overlooks','JJ'),('mistake','NN'),('makes','VBZ'),('smallest','JJS'),('allowance','NN'),('ignorance','NN')]这里,关于NLTK各个标记的含义,读者可以在编译器中,输入下面这行代码来进行查看:nltk.help.upenn_tagset()利用NLTK进行词形还原

有些时候,仅仅利用词干提取来去还原单词还是不够的,而且词干提取经常会创造一些字典上并不存在的“新单词”,这也是词干提取和词形还原的最大不同之处。所谓词形还原,就是在实际的单词基础上进行的还原,而不会凭空创造出新的单词。词形还原所用到的是NLTK.stem中的WordNetLemmatizer,下面将会和词干提取一起进行演示importnltkfromnltk.corpusimportstopwordsfromnltk.tokenizeimportword_tokenizefromnltk.stemimportWordNetLemmatizerfromnltk.stemimportPorterStemmerps=PorterStemmer()wdl=WordNetLemmatizer()s=input()s=s.lower()top_words=set(stopwords.words('english'))s=word_tokenize(s)tmp=[xforxinsifnotxinstop_w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论