打开 Google, 输入搜索关键词,显示上百条搜索结果

打开 Google Translate, 输入待翻译文本,翻译结果框中显示出翻译结果

以上二者的共同点便是文本预处理 Pre-Processing

在 NLP 项目中,文本预处理占据了超过半数的时间,其重要性不言而喻。


当然
也可以利用完备且效率可观的工具可以快速完成项目

For Example: 我一直在使用的由 哈工大社会计算与信息检索研究中心开发的 (LTP,Language Technology Platform )语言技术平台


文本预处理

文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:

【较为简单的步骤,如果需要专门做NLP相关的时候,要进行特殊的预处理】

  1. 读入文本
  2. 分词
  3. 建立字典,将每个词映射到一个唯一的索引(index)
  4. 将文本从词的序列转换为索引的序列,方便输入模型

中英文文本预处理的特点

  • 中文文本是没有像英文的单词空格那样隔开的,因此不能直接像英文一样可以直接用最简单的空格和标点符号完成分词。所以一般我们需要用分词算法来完成分词。

  • 英文文本的预处理特殊在拼写问题,很多时候,对英文预处理要包括拼写检查,比如“Helo World”这样的错误,我们不能在分析的时候再去纠错。还有就是词干提取(stemming)和词形还原(lemmatization),主要是因为英文中一个词会存在不同的形式,这个步骤有点像孙悟空的火眼金睛,直接得到单词的原始形态。For Example:" faster “、” fastest " -> " fast ";“ leafs ”、“ leaves ” -> " leaf " 。

本文进行简要的介绍和实现
详细可参考:https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/

读入文本

引入数据源:http://www.gutenberg.org/ebooks/35【小说 Time Machine】

import collections
import redef read_time_machine():with open('path to timemachine.txt', 'r') as f: #每次处理一行lines = [re.sub('[^a-z]+', ' ', line.strip().lower()) for line in f]  #正则表达式return lineslines = read_time_machine()
print('# sentences %d' % len(lines))

分词

对每个句子进行分词,也就是将一个句子划分成若干个词(token),转换为一个词的序列。

def tokenize(sentences, token='word'):"""Split sentences into word or char tokens"""if token == 'word':return [sentence.split(' ') for sentence in sentences]elif token == 'char':return [list(sentence) for sentence in sentences]else:print('ERROR: unkown token type '+token)tokens = tokenize(lines)
tokens[0:2]
#分词结果:
[['the', 'time', 'machine', 'by', 'h', 'g', 'wells', ''], ['']]

建立字典

为了方便模型处理,将字符串转换为数字。因此先构建一个字典(vocabulary),将每个词映射到一个唯一的索引编号。

class Vocab(object):# 构建Vocab类时注意:句子长度统计与构建字典无关 | 所以不必要进行句子长度统计def __init__(self, tokens, min_freq=0, use_special_tokens=False):counter = count_corpus(tokens)  #<key,value>:<词,词频>self.token_freqs = list(counter.items()) #去重并统计词频self.idx_to_token = []if use_special_tokens:# padding, begin of sentence, end of sentence, unknownself.pad, self.bos, self.eos, self.unk = (0, 1, 2, 3)self.idx_to_token += ['<pad>', '<bos>', '<eos>', '<unk>']else:self.unk = 0self.idx_to_token += ['<unk>']self.idx_to_token += [token for token, freq in self.token_freqsif freq >= min_freq and token not in self.idx_to_token]self.token_to_idx = dict()for idx, token in enumerate(self.idx_to_token):self.token_to_idx[token] = idxdef __len__(self): # 返回字典的大小return len(self.idx_to_token)def __getitem__(self, tokens):  # 词到索引的映射if not isinstance(tokens, (list, tuple)):return self.token_to_idx.get(tokens, self.unk)return [self.__getitem__(token) for token in tokens]def to_tokens(self, indices):  #索引到词的映射if not isinstance(indices, (list, tuple)):return self.idx_to_token[indices]return [self.idx_to_token[index] for index in indices]def count_corpus(sentences):tokens = [tk for st in sentences for tk in st]return collections.Counter(tokens)  # 返回一个字典,记录每个词的出现次数

< unk > 较为特殊,表示为登录词,无论 use_special_token 参数是否为真,都会用到

将词转为索引

使用字典,我们可以将原文本中的句子从单词序列转换为索引序列

for i in range(8, 10):print('words:', tokens[i])print('indices:', vocab[tokens[i]])

到此,按照常见步骤已经介绍完了

我们对于分词这一重要关卡需要考虑的更多,上边实现的简要分词许多情形还未完善,只能实现部分特定的分词

  1. 标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
  2. 类似“shouldn’t", "doesn’t"这样的词会被错误地处理
  3. 类似"Mr.", "Dr."这样的词会被错误地处理

一者,我们可以通过引入更复杂的规则来解决这些问题,但是事实上,有一些现有的工具可以很好地进行分词,在这里简单介绍其中的两个:spaCy和NLTK。

For Example :

text = “Mr. Chen doesn’t agree with my suggestion.”

spaCy

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)
print([token.text for token in doc])
Result:
['Mr.', 'Chen', 'does', "n't", 'agree', 'with', 'my', 'suggestion', '.']

NLTK

from nltk.tokenize import word_tokenize
from nltk import data
data.path.append('/home/kesci/input/nltk_data3784/nltk_data')
print(word_tokenize(text))
Result:
['Mr.', 'Chen', 'does', "n't", 'agree', 'with', 'my', 'suggestion', '.']

Text Preprocessing相关推荐

  1. 【小白学习keras教程】十一、Keras中文本处理Text preprocessing

    @Author:Runsen 文章目录 Text preprocessing Tokenization of a sentence One-hot encoding Padding sequences ...

  2. 第一篇:text preprocessing文本预处理

    语言是组成式的,对于人类而言,我们需要将长串的文本分割成独立的部分.对于计算机而言,理解语言也是如此.那么预处理就是第一步. 预处理的常规步骤: 移除不想要的格式(比如html). 句子切分:将文档分 ...

  3. 《Deep Learning With Python second edition》英文版读书笔记:第十一章DL for text: NLP、Transformer、Seq2Seq

    文章目录 第十一章:Deep learning for text 11.1 Natural language processing: The bird's eye view 11.2 Preparin ...

  4. python为text添加滚动条_动态创建小部件pythontkinter并在画布中添加滚动条

    我是Python和stackoverFlow的新手. 我正在尝试从输入第一列CSV文件自动创建复选框小部件.我怎样才能使滚动条在正确的位置.下面的图片在输入CSV文件前,滚动条在正确的位置 下图输入C ...

  5. Feature Preprocessing on Kaggle

    刚入手data science, 想着自己玩一玩kaggle,玩了新手Titanic和House Price的 项目, 觉得基本的baseline还是可以写出来,但是具体到一些细节,以至于到能拿到的出 ...

  6. 独家 | 关于NLP和机器学习之文本处理的你需要知道的一切(附学习资源)

    作者:Kavita Ganesan 翻译:陈雨琳 校对:丁楠雅 本文4800字,建议阅读20分钟. 本文将介绍自然语言处理和机器学习中常见的文本预处理方法. 标签: 数据处理 https://www. ...

  7. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  8. 李沐《动手学深度学习》PyTorch 实现版开源,瞬间登上 GitHub 热榜!

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 李沐,亚马逊 AI 主任科学家,名声在外!半年前,由李沐.Aston Zhang 等人合力打造 ...

  9. 机器学习 文本分类 代码_无需担心机器学习-如何在少于10行代码中对文本进行分类

    机器学习 文本分类 代码 This article builds upon my previous two articles where I share some tips on how to get ...

最新文章

  1. 从大麦网架构学到的东西
  2. 怎样增加网站的百度权重
  3. leetcode算法题--删除链表的倒数第N个节点
  4. 记一次某APK的恶意WIFI攻击
  5. 日本Blogger专用电脑
  6. 数据库行转列在现实需求中的用法
  7. 带你玩转七牛云存储——高级篇
  8. python的2种字符串格式化输出
  9. 一道看似简单的sql需求却难倒各路高手 - 你也来挑战下吗?
  10. 慢系统调用 与 信号
  11. esp8266 继电器接线图_如何使用ESP8266和Android控制继电器
  12. MIMO系统信道容量分析
  13. Vue watch 监听复杂对象变化,oldvalue 和 newValue 一致的解决办法。
  14. 多功能纺织品易燃性测试仪市场现状及未来发展趋势
  15. 【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
  16. python交易是什么意思_py交易是什么意思?
  17. 一地鸡毛——软件项目中的人际困局
  18. Python 输入、输出
  19. 利用主成分PCA进行特征提取
  20. 世界上第一台计算机内存容量,29、世界上第一台电子计算机ENIAC诞生于.doc

热门文章

  1. 快看漫画如何构建好的用户画像平台?
  2. ubuntu装机分区
  3. Android代码规范_持续更新
  4. Java并发编程面试题(精心整理100家互联网企业,最全面试题祝你面试上岸)
  5. 二十天入门Java系列:第一天
  6. js获取当前时间字符串 格式yyyy-MM-dd HH:MM:SS
  7. css设置背景图片可滚动样式
  8. 尚硅谷设计模式学习(四)工厂模式
  9. Unity 工具类 之 编辑扩展器 之 简单的音效管理编辑扩展器面板实现
  10. pycharm只显示左侧project,不显示项目目录