基本文本的处理

  • 基本文本的处理
    • 语料库
      • nltk的基本语料库函数
      • nltk语料库的导入
      • 文本的词汇多样性
      • 词频统计
      • utf8和unicode的python实现
      • python读取本地文件
      • 练习
    • 正则表达式及其应用
      • 正则表达式模块
      • 基本元字符
      • 正则表达式在NLP中的应用
        • 捕获与提取词干
        • nltk词干提取器
        • 词形归并
        • 使用re分词
      • re库的使用举例
      • 练习

基本文本的处理

语料库

nltk的基本语料库函数

nltk语料库的导入

from nltk.book import *
from nltk.corpus import gutenberg

文本的词汇多样性

在计算文本长度时,按照词次数(token_number)计数。即,len(text)。

定义函数lexcical_diversity(),计算文本的词汇多样性。即词次数(token_number)/词数(type_number)。

def lexcical_diversity(text):return len(text) / len(set(text))

词频统计

# 导入语料库
from nltk.book import *
# 导入词频
from nltk.probability import FreqDist# 生成词频的词典
fd1 = FreqDist(text1)
# 生成前50词的 (词形, 词频) 的列表
mw1 = fd1.most_common(50)
# 绘制前100词的词频累计图
fd1.plot(100, cumulative = True)
# 绘制词分布图
text8.dispersion_plot(['crazy', 'love'])

utf8和unicode的python实现

# 导入库
import codecs#unicode 编码解码
codecs.unicode_escape_encode(ch)
codecs.unicode_escape_decode(ch)
#utf-8 编码解码
codecs.utf_8_encode(ch)
codecs.utf_8_decode(ch)

python读取本地文件

# 打开文件,注意文件路径
f = open('license.txt')
# 读入一行
raw = f.read()

练习

  1. 制作《理智与情感》(text2)中四个主角:Elinor,Marianne,Edward和Willoughby的分布图

    text2.dispersion_plot(['Elinor', 'Marianne', 'Edward', 'Willoughby'])
    
  2. 计算两个数的最小公倍数

    # 计算两个数的最小公倍数
    def Least_common_multiple(a, b):for i in range(2, min(a, b)):if a % i == 0 and b % i == 0:a /= ib /= ireturn a * b
    
  3. 切片表达式提取text2 中最后一个、两个词

    last1 = text2[-2:-1]
    last2 = text2[-3:-1]
    
  4. 使用for 和if 语句组合循环遍历《巨蟒和圣杯》(text6)的电影剧本中的词。输出所有的大写词作为一个列表。

    lis = [word for word in text6 if word.isupper()]
    
  5. 找出聊天语料库(text5)中所有四个字母的词。使用频率分布函数(FreqDist),以频率从高到低显示这些词。

    lis = [word for word in text5 if len(word) == 4]
    FreqDist(lis).plot(100)
    # FreqDist库不适用,则导入plt库
    import matplotlib.pyplot as plt
    fq = [s for (w, s) in FreqDist(lis).most_common(50)]
    plt.plot(fq)
    plt.show()
    
  6. 写表达式找出text6 中所有符合下列条件的词。要求结果是词链表的形式:[‘word1’, ‘word2’, …]。
    a. 以ize 结尾
    b. 包含字母z
    c. 包含字母序列pt
    d. 除了首字母外是全部小写字母的词(即titlecase)

    s1=[w for w in text6 if w.endswith('ize')]
    s2=[w for w in text6 if 'z' in w]
    s3=[w for w in text6 if 'pt' in w]
    s4=[w for w in text6 if w.istitle()]
    
  7. 定义sent 为词链表[‘she’, ‘sells’, ‘sea’, ‘shells’, ‘by’, ‘the’, ‘sea’, ‘shore’]。编写代码执行以下任务:
    a. 输出所有sh 开头的单词
    b. 输出所有长度超过4 个字符的词

    s5=[w for w in sent if w.startswith('sh')]
    s6=[w for w in sent if len(w)>4]
    
  8. 定义函数vocab_size(text),返回文本的词汇量。

    def vocab_size(text):return len(set(lis))
    
  9. 定义函数percent(word, text),计算一个给定的词在文本中出现的频率。结果以百分比表示。

    def percent(word, text):cnt = sum([1 for w in text if word == w])return cnt / len(text) * 100
    
  10. 计算文本的平均词长

    def avgWordLen(text):return sum([len(w) for w in text]) / len(text)
    

正则表达式及其应用

正则表达式由两部分组成:

  1. 特殊字符/元字符–meta_characters
  2. 其他字符–literal

正则表达式模块

导入模块

import re

正则表达式匹配的函数调用:

  1. re.search(pattern, string)
    返回匹配对象,只返回第一个找到的匹配子串

  2. re.search(pattern, string).group()
    获取匹配子串。

  3. re.findall(pattern, string)
    返回所有被匹配模式的列表。

基本元字符

已有wordlist,如下:

import nltk
# 'en' 表示english,指英文词汇
# 在words.words()中用'en',在stopwords.words()中用'english'
wordlist = [w for w in nltk.corpus.words.words('en') if w.islower()]
  1. $ 匹配结尾
    例:列出wordlist中全部以ed结尾的词

    [w for w in wordlist if re.search('ed$'. w)]
    
  2. ^ 匹配开始
    例:列出以th开始的词

    [w for w in wordlist if re.search('^th', w)]
    
  3. . 匹配所有单个字符
    例:列出第二个字符是的词

    [w for w in wordlist if re.search('^.s', w)]
    
  4. ? 表示其前面的字符有1个或0个,即≤1
    例:匹配email和e-mail

    re.search('^e-?mail', w)
    
  5. + 表示前面的字符有1个或多个,即≥1
    例:可以用来匹配goo(o···oo)gle

    re.search('^goo+gle', w)
    
  6. * 表示前面的字符有0个或多个,即≥0
    例:匹配任意个任意字符’.*’

  7. {m, n} 表示前面的字符至少出现m次,至多出现n次,即m≤字符出现字数≤n。特别地,{n}表示恰好出现n次,{, n}表示出现≤n次,{n, }表示出现≥n次
    例:可以匹配到’sheet’,'sheep’等

    re.search('^she{2}', w)
    
  8. [] 表示在其中字符中任选一个进行匹配
    注意,匹配是按照字符串中字符出现的位置顺序进行的,并不是按照模式中的顺序。
    例:匹配的返回内容’ce’

    re.search('[cer]', iceberg)
    

    在[] 之中,当’^'作为第一个字符出现时,其含义为否定。即,[ ^ ]表示不与括号内字符之内的所有字符匹配。
    例:匹配非元音字母开始的词

    re.search('^[^aeiouAEIOU]', w)
    
  9. | 在左右中选择一个字符进行匹配,优先选择左边
    例1:先匹配以th开头的,如果匹配不上,匹配以sh开头的

    re.search('^th|^sh', w)
    

    例2:先匹配以th开头的,如果匹配不上,匹配以sh结尾的

    re.search('^th|sh$', w)
    
  10. () 限定操作符的作用范围
    例1:匹配以sh开头的,如果匹配不上,匹配以th开头的

    re.search('^(th|sh)', w)
    

    例2:匹配以sh开头的,如果匹配不上,匹配含有sh的

    re.search('^th|sh', w)
    
  11. \ 表示回复后面字符的原意
    例:网址匹配

    re.search('^w{3}\.cuc\.edu', 'www.cuc.edu.cn')
    

    注意:应避免正则表达式被python解释为一般字符串,它应被留给re解释器解释。因此,一般最好在正则表达式前加r,这样python就不会解释其中的特殊字符了。

例:在格式文本中的一行,’:‘之前是题目,’:'之后是内容。将题目和内容分开。

import re
from nltk.book import *str = '春晓:春眠不觉晓,处处闻啼鸟'result1 = re.search('(.*):', str)
# 结果:<re.Match object; span=(0, 3), match='春晓:'>
print(result1)
# 结果:春晓:
print(result1.group())
# 结果:春晓
print(result1.group(1))result2 = re.search(':(.*)', str)
# 结果:<re.Match object; span=(2, 14), match=':春眠不觉晓,处处闻啼鸟'>
print(result2)
# 结果::春眠不觉晓,处处闻啼鸟
print(result2.group())
# 结果:春眠不觉晓,处处闻啼鸟
print(result2.group(1))

正则表达式在NLP中的应用

捕获与提取词干

对比:

  1. 使用字符串方法,去掉词后缀只提取词干信息

    def stem(word):
    for suffix in ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']:if word.endswith(suffix):return word[:-len(suffix)]
    return word
    
  2. 基于re的词干提取器

    # 结果:列表['ing']
    re.findall(r'^.*(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing')# 结果:<re.Match object; span=(0, 10), match='processing'>
    re.search(r'^.*(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing') # findall函数返回一个列表,列表的第一个元素(也是唯一一个元素)即为其后缀。
    def stem(w):w[:-len(re.findall(r'^.*(ing|ly|ed|ious|ies|ive|es|s|ment)$', w)[0])]
    

nltk词干提取器

nltk提供已有的词干提取器,以应对re或字符串不能够处理的不规则情况。

word = 'lying'poter = nltk.PorterStemmer()
# 结果:lie
print(poter.stem(word))lancaster = nltk.LancasterStemmer()
# 结果:lying
print(lancaster.stem(word))snowball = nltk.SnowballStemmer('english')
# 结果:lie
print(snowball.stem(word))

词形归并

恢复词的原型,是词义处理的第一步。它消除词的屈折变化。这个过程被称为“lemmatize”。

nltk有WordNet提供的lemmatize的工具。

wnl = nltk.WordNetLemmatizer()
# 结果:lying
print(wnl.lemmatize('lying'))
# 结果:foot
print(wnl.lemmatize('feet'))

使用re分词

re.split(pattern, string)函数,将string以pattern切分

re.split(r'', string)
re.split(r'\t\n', string)
# \W表示字符数字下划线以外的所有字符,+表示1个或多个
re.split(r'\W+', string)

re库的使用举例

  1. 查找词集中的元音连对:

    [vs for w in wordlist for vs in re.findall(r'[aeiou]{2,}', w)]
    
  2. 压缩单词中的元音:

    def compress(word):pieces = re.findall(regexp, word)return ''.join(pieces)
    
  3. 辅音元音对的条件分布,音位分布:

    rotokas_words = nltk.corpus.toolbox.words('rotokas.dic')
    cvs = [cv for w in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]', w)]
    cfd = nltk.ConditionalFreqDist(cvs)
    cfd.tabulate()
    

练习

  1. 使用re查找百分数

    re.search(r'^\d+(\.\d+)?%$', '12.34%')
    
  2. 使用正则表达式取出文本中非字母的词

    re.findall(r'[^a-zA-Z]+', string)
    

python的基本文本处理操作相关推荐

  1. 【新星计划】 Python的txt文本操作-读、写

    Python的txt文本操作-读.写 读取txt文本 python常用的读取文件函数有三种read().readline().readlines() 以读取上述txt为例,看一下三者的区别 read( ...

  2. python怎么重命名word文件,Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...

  3. python读取word内容复制粘贴,Python读取word文本操作详解

    本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下. 一,docx模块 Python可以利用python-docx模块处理word文档,处理方式是面向对象的.也就 ...

  4. 怎么用python读取csv文件、并且是读取行-使用python获取csv文本的某行或某列数据的实例...

    站长用Python写了一个可以提取csv任一列的代码,欢迎使用.Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存 ...

  5. python csv读取-使用python获取csv文本的某行或某列数据的实例

    站长用Python写了一个可以提取csv任一列的代码,欢迎使用.Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以存 ...

  6. python语音在线编辑-Python如何实现文本转语音

    准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了. 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相 ...

  7. python电脑发音-Python如何实现文本转语音

    准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了. 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相 ...

  8. python简单发音-Python如何实现文本转语音

    准备 我测试使用的Python版本为2.7.10,如果你的版本是Python3.5的话,这里就不太适合了. 使用Speech API 原理 我们的想法是借助微软的语音接口,所以我们肯定是要进行调用 相 ...

  9. Python之re模块 —— 正则表达式操作

    Python之re模块 -- 正则表达式操作 转自:http://www.cnblogs.com/PythonHome/archive/2011/11/19/2255459.html 这个模块提供了与 ...

最新文章

  1. 一个简单自激振荡器电路分析
  2. visio 转 pdf 裁边 ——使用pdfcrop对PDF裁边
  3. 我的第一个项目(人力资源管理之报表管理)
  4. [\u4e00-\u9fa5] //匹配中文字符
  5. leetcode题解108-将有序数组转换为二叉排序树
  6. Libsvm Java
  7. SSH框架总结(框架分析+环境搭建+实例源码下载)
  8. 各浏览器的Hack写法【转】
  9. 相机标定原理介绍(一)
  10. 5.FlashFXP连接失败(连接已拒绝)及530 permission denied(以root用户连接已被客户端关闭)
  11. 环境化学试题及答案大全
  12. 任务一: SpringMVC基本应用
  13. 解读一个有趣的网站seo,论网站如何快速上词以及上量
  14. 电影《乌云背后的幸福线》观后感
  15. python中什么是参数_Python中**和*参数有什么用
  16. ctf_show_misc_wp
  17. 疑难杂症篇(十)--Catia软件出现“没有合适的许可证来实现xx的请求”解决方案
  18. Mysql安装与设置用户名、密码
  19. Nature子刊:清华研究团队盘点类脑计算芯片简史
  20. WEB结合WML图铃下载全功略

热门文章

  1. 解读混淆矩阵在语义分割FCN指标计算中的应用(含代码实现)
  2. IFD-x 微型红外成像仪(模块)的温度测量和成像精度
  3. 青山绿水一枝花...
  4. python获取当前日期所在的是本月第几周
  5. 【诺奖-1】2018年诺贝尔生理学或医学奖
  6. fw325r服务器无响应,迅捷fw325r显示已连接不可上网怎么办?
  7. python模拟访问js_百度统计原理分析-利用PHP/Python实现模拟访问
  8. 读书笔记:少有人走的路
  9. STM32 CAN通信之二:正常模式
  10. 跟着鹏哥学C语言第一天