1. 基本文本处理技能

1.1 中英文字符串处理

1.1.1 删除不相关的字符

去除字符串两端字符串:

s='    ,,,abc,,,   '
print(s.strip())# 删除两边空字符
print(s.lstrip())# 删除左边空字符
print(s.rstrip())#  删除右边空字符
print(s.strip().strip(','))# 删除指定字符
,,,abc,,,
,,,abc,,,   ,,,abc,,,
abc

replace替换

s1='123abc456'
print(s1.replace('123',''))

正则表达式去除字符

import re
s2='123abc456'
print(re.sub('\d+','.',s2))

正则表达式的用法可以参考 https://www.liaoxuefeng.com/wiki/1016959663602400/1017639890281664
常用辅助网站
https://regex101.com

1.1.2 去除停用词

之前写爬虫做词云用到过停用词.
停用词在主要指一些常用的虚词, 出现频率高, 但是又没有实际意义, 所以在许多进行文本分析的场景下需要去掉.
常与jieba分词共同使用.
这一部分不多叙述, 参见下面分词部分.

1.2 分词

jieba分词是一个常用的开源分词工具. 官方链接: https://github.com/fxsjy/jieba
支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;cut_all=False
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;cut_all=True
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。jieba.cut_for_search()

1.2.1 安装

pip install jieba

1.2.2 简单使用

import jieba
#精确模式
seg_list=jieba.cut('请确认商品完好后签收',cut_all=False)#cut_all默认为False
print('/ '.join(seg_list))#join是split的逆操作
#全模式
seg_list=jieba.cut('请确认商品完好后签收',cut_all=True)
print('/ '.join(seg_list))
#搜索模式
seg_list=jieba.cut_for_search("对于美方发起的贸易战,中国早就表明态度:不愿打,但也不怕打,必要时不得不打")
print('/ '.join(seg_list))


在这里我犯了一个很智障的错误, 不能把python文件命名为jieba, https://github.com/fxsjy/jieba/issues/219

1.2.3 停用词

import jieba  # jieba.load_userdict('userdict.txt')
# 创建停用词list
def stopwordslist(filepath):  stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]  return stopwords  # 对句子进行分词
def seg_sentence(sentence):  sentence_seged = jieba.cut(sentence.strip())  stopwords = stopwordslist('stopwords.txt')  # 这里加载停用词的路径  outstr = ''  for word in sentence_seged:  if word not in stopwords:  if word != '\t':  outstr += word  outstr += " "  return outstr  inputs = open('cnews.val.txt', 'r', encoding='utf-8')
outputs = open('output.txt', 'w')
for line in inputs:  line_seg = seg_sentence(line)  # 这里的返回值是字符串  outputs.write(line_seg + '\n')
outputs.close()
inputs.close()

这里用上次的THUCNews中的cnews.val.txt作为输出数据, stopwords.txt是我大一的时候做爬虫时下载的, 已经不知道出处了.
这两个文件都放在当前目录下, 运行得如下结果.

原本的cnews.val.txt如下:

对比可以发现"中","对于"这些虚词已经被去掉了.

1.3 词、字符频率统计

1.3.1 最简单的方法

import collections
import os
f=open('output.txt',"r")
news=[]
for i in range(10):string=f.readline()string=string.split(' ')news+=string
print(collections.Counter(news))

结果如下:

利用jieba分词进行关键词提取

jieba实现了TF-IDF和TextRank这两种关键词提取算法, 这里也会使用到jieba自带的前缀词典和IDF权重词典。

import jieba.analyse
import os
f=open('output.txt',"r")
news=''
for i in range(10):string=f.readline()news+=string
# 第一个参数:待提取关键词的文本
# 第二个参数:返回关键词的数量,重要性从高到低排序
# 第三个参数:是否同时返回每个关键词的权重
# 第四个参数:词性过滤,为空表示不过滤,若提供则仅返回符合词性要求的关键词
keywords = jieba.analyse.extract_tags(news, topK=20, withWeight=True, allowPOS=())
# 访问提取结果
for item in keywords:# 分别为关键词和相应的权重print(item[0], item[1])# 同样是四个参数,但allowPOS默认为('ns', 'n', 'vn', 'v')
# 即仅提取地名、名词、动名词、动词
keywords = jieba.analyse.textrank(news, topK=20, withWeight=True, allowPOS=('ns', 'n', 'vn', 'v'))
# 访问提取结果
for item in keywords:# 分别为关键词和相应的权重print(item[0], item[1])

结果如下:

2. 语言模型

2.1 定义

统计语言模型是一个单词序列上的概率分布,对于一个给定长度为m的序列,它可以为整个序列产生一个概率 P(w_1,w_2,…,w_m) 。其实就是想办法找到一个概率分布,它可以表示任意一个句子或序列出现的概率。
下面介绍一下n-gram模型方法.

2.2 n-gram模型

n-gram模型:unigram、bigram、trigram
为了解决自由参数数目过多的问题,引入了马尔科夫假设:随意一个词出现的概率只与它前面出现的有限的n个词有关。基于上述假设的统计语言模型被称为N-gram语言模型。

当n取1、2、3时,n-gram模型分别称为unigram、bigram、trigram语言模型

  • unigram 一元分词,把句子分成一个一个的汉字
  • bigram 二元分词,把句子从头到尾每两个字组成一个词语,也叫一阶马尔科夫链
  • trigram 三元分词,把句子从头到尾每三个字组成一个词语,也叫二阶马尔科夫链
    转自 https://blog.csdn.net/u012736685/article/details/88206485
    这部分我目前还不是很懂, 这几天加深一下理解再补充.

3. 参考链接

https://blog.csdn.net/u012052268/article/details/77825981#python_0
https://github.com/fxsjy/jieba
https://zhuanlan.zhihu.com/p/52061158
https://blog.csdn.net/u012736685/article/details/88206485

NLP系列 2.特征提取相关推荐

  1. NLP系列(5)_从朴素贝叶斯到N-gram语言模型

    作者: 龙心尘 && 寒小阳 时间:2016年2月. 出处:http://blog.csdn.net/longxinchen_ml/article/details/50646528 h ...

  2. 自然语言处理NLP系列(一)——文本预处理

    自然语言处理NLP系列(一)--文本预处理 1 英文文本预处理 1.1 个人认为英文文本预处理分两步就可 第一步,将文本中含有的常用标点符号用空格替换掉,这么做的原因是英文中标点和单词之间是没有空格, ...

  3. 【NLP系列公开课】详解BERT、知识图谱、对话生成、图卷积神经网络

    大家好,我是贪心学院的小编.自从今年二月份举办的火爆的BERT.XLNet专题课以来,已经三个月没有跟大家见面了.这一次我们又给大家带来了重磅级的系列公开课,由贪心学院和京东智联云联合打造,共四次公开 ...

  4. 【Python机器学习】系列之特征提取与处理篇

    转载:http://www.10tiao.com/html/502/201607/2653283084/1.html 第1章 机器学习基础 将机器学习定义成一种通过学习经验改善工作效果的程序研究与设计 ...

  5. NLP系列(7)_Transformer详解

    审校:百度NLP.龙心尘 翻译:张驰.毅航.Conrad 原作者:Jay Alammar 原链接:https://jalammar.github.io/illustrated-transformer/ ...

  6. NLP基础--文本特征提取中文分词word2vec原理

    文章目录 1. 文本特征提取 1.1 词集模型 1.2 BOW(Bag of Words)词袋模型 1.3 TF-IDF 2. 中文分词 2.1 基于词典匹配的分词方法 2.1.1 正向最大匹配(MM ...

  7. NLP系列——(4)文本表示

    文本表示 1.文本表示 2. 文本表示的方法 2.1 one-hot表示 2.2 word2vec 2.2.1 CBOW 2.2.2 Skip-Gram 1.文本表示 文本表示的意思是把字词处理成向量 ...

  8. NLP系列笔记:通俗理解LDA主题模型

    0 前言     印象中,最开始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印过一次,但不知是 ...

  9. NLP系列(10)_词向量之图解Word2vec

    审校:龙心尘 作者:Jay Alammar 编译:张秋玥.毅航.高延 https://blog.csdn.net/longxinchen_ml/article/details/89077048 原文链 ...

最新文章

  1. php页面刷新$_session会变化,每次刷新页面都会生产新的session_id
  2. POJ2533解题报告
  3. hdu1671 字典树记录前缀出现次数
  4. PHP为什么empty可以访问不存在的索引
  5. Mybatis构建sql语法
  6. RMI和WebService
  7. angular4-http
  8. C++11智能指针处理Array对象
  9. MSSQL数据库管理---索引
  10. 2.口袋西游寻路call
  11. 荣耀手机动态修改手机型号参数
  12. 深度学习在语音识别中的算法、应用、数据集、行业分析
  13. Linux下定时备份数据库
  14. 双网卡双线路DNS解析分析
  15. CC3200学习——blinky资料
  16. mysql中日期相减_非凡教育教你excel怎么计算两个日期天数差和时间差
  17. JavaScript代码具体是怎么引入到HTML中的?
  18. php面向对象(基础)
  19. 博图SCL_先进先出排序法
  20. 开源的XAG迈向新征程

热门文章

  1. CityMaker学习教程11 创建和移动标签
  2. citymaker 8 sketchup和3dsmax直接导出fdb
  3. STM32F1单片机零基础学习(1)
  4. 判断一个数是不是质数
  5. 以周一为每周的第一天,计算周数
  6. JAVA中的String[] args和String args[]详解。
  7. 网络对抗 Exp9 Web安全基础 20154311 王卓然
  8. 关于根轨迹对于控制系统的一点理解
  9. 神州租车——为用户提供精细化租车服务
  10. vs用Python爬数据?(一)网页抓取