文本预处理

timemachine.txt数据下载地址

链接:https://pan.baidu.com/s/1RO2OLyTRQZ90HJUW7V7BCQ

提取码:bjox

NLTK数据集下载

链接:https://pan.baidu.com/s/1IvRhPOU2hUsQejQVunt5mQ

提取码:z2eh

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

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

读入文本

我们用一部英文小说,即H. G. Well的Time Machine,作为示例,展示文本预处理的具体过程。

  1. import collections
  2. import re
  3. def read_time_machine():
  4. with open('/home/kesci/input/timemachine7163/timemachine.txt', 'r') as f:
  5. lines = [re.sub('[^a-z]+', ' ', line.strip().lower()) for line in f]
  6. return lines
  7. lines = read_time_machine()
  8. print('# sentences %d' % len(lines))
  1. # sentences 3221

分词

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

  1. def tokenize(sentences, token='word'):
  2. """Split sentences into word or char tokens"""
  3. if token == 'word':
  4. return [sentence.split(' ') for sentence in sentences]
  5. elif token == 'char':
  6. return [list(sentence) for sentence in sentences]
  7. else:
  8. print('ERROR: unkown token type '+token)
  9. tokens = tokenize(lines)
  10. tokens[0:2]
  1. [['the', 'time', 'machine', 'by', 'h', 'g', 'wells', ''], ['']]

建立字典

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

  1. class Vocab(object):
  2. def __init__(self, tokens, min_freq=0, use_special_tokens=False):
  3. counter = count_corpus(tokens) # :
  4. self.token_freqs = list(counter.items())
  5. self.idx_to_token = []
  6. if use_special_tokens:
  7. # padding, begin of sentence, end of sentence, unknown
  8. self.pad, self.bos, self.eos, self.unk = (0, 1, 2, 3)
  9. self.idx_to_token += ['', '', '', '']
  10. else:
  11. self.unk = 0
  12. self.idx_to_token += ['']
  13. self.idx_to_token += [token for token, freq in self.token_freqs
  14. if freq >= min_freq and token not in self.idx_to_token]
  15. self.token_to_idx = dict()
  16. for idx, token in enumerate(self.idx_to_token):
  17. self.token_to_idx[token] = idx
  18. def __len__(self):
  19. return len(self.idx_to_token)
  20. def __getitem__(self, tokens):
  21. if not isinstance(tokens, (list, tuple)):
  22. return self.token_to_idx.get(tokens, self.unk)
  23. return [self.__getitem__(token) for token in tokens]
  24. def to_tokens(self, indices):
  25. if not isinstance(indices, (list, tuple)):
  26. return self.idx_to_token[indices]
  27. return [self.idx_to_token[index] for index in indices]
  28. def count_corpus(sentences):
  29. tokens = [tk for st in sentences for tk in st]
  30. return collections.Counter(tokens) # 返回一个字典,记录每个词的出现次数

我们看一个例子,这里我们尝试用Time Machine作为语料构建字典

  1. vocab = Vocab(tokens)
  2. print(list(vocab.token_to_idx.items())[0:10])
  1. [('', 0), ('the', 1), ('time', 2), ('machine', 3), ('by', 4), ('h', 5), ('g', 6), ('wells', 7), ('i', 8), ('traveller', 9)]

将词转为索引

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

  1. for i in range(8, 10):
  2. print('words:', tokens[i])
  3. print('indices:', vocab[tokens[i]])
  1. words: ['the', 'time', 'traveller', 'for', 'so', 'it', 'will', 'be', 'convenient', 'to', 'speak', 'of', 'him', '']
  2. indices: [1, 2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0]
  3. words: ['was', 'expounding', 'a', 'recondite', 'matter', 'to', 'us', 'his', 'grey', 'eyes', 'shone', 'and']
  4. indices: [20, 21, 22, 23, 24, 16, 25, 26, 27, 28, 29, 30]

用现有工具进行分词

我们前面介绍的分词方式非常简单,它至少有以下几个缺点:

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

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

下面是一个简单的例子:

  1. text = "Mr. Chen doesn't agree with my suggestion."

spaCy:

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

NLTK:

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

L4文本预处理的更多相关文章

  1. 【NLP】Tika 文本预处理:抽取各种格式文件内容

    Tika常见格式文件抽取内容并做预处理 作者 白宁超 2016年3月30日18:57:08 摘要:本文主要针对自然语言处理(NLP)过程中,重要基础部分抽取文本内容的预处理.首先我们要意识到预处理的重 ...

  2. Keras文本预处理

    学习了Keras文档里的文本预处理部分,参考网上代码写了个例子 import keras.preprocessing.text as T from keras.preprocessing.text i ...

  3. [ DLPytorch ] 文本预处理&语言模型&循环神经网络基础

    文本预处理 实现步骤(处理语言模型数据集距离) 文本预处理的实现步骤 读入文本:读入zip / txt 等数据集 with zipfile.ZipFile('./jaychou_lyrics.txt. ...

  4. NLP自然语言处理入门-- 文本预处理Pre-processing

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  5. 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作

    目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...

  6. 学习笔记--python中使用多进程、多线程加速文本预处理

    一.任务描述 最近尝试自行构建skip-gram模型训练word2vec词向量表.其中有一步需要统计各词汇的出现频率,截取出现频率最高的10000个词汇进行保留,形成常用词词典.对于这个问题,我建立了 ...

  7. NLP 文本预处理

    1.不同类别文本量统计,类别不平衡差异 2.文本长度统计 3.文本处理,比如文本语料中简体与繁体共存,这会加大模型的学习难度.因此,他们对数据进行繁体转简体的处理. 同时,过滤掉了对分类没有任何作用的 ...

  8. Python3实现文本预处理

    1.数据集准备 测试数据集下载:https://github.com/Asia-Lee/Vulnerability_classify/blob/master/testdata.xls 停用词过滤表下载 ...

  9. python 参议院文本预处理的一维数组的间隔空间

    #!/usr/bin/python import re def pre_process_msg ( msgIn ):     if msgIn=="":         retur ...

随机推荐

  1. 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现

    题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...

  2. RNN,GRU,LSTM

    2019-08-29 17:17:15 问题描述:比较RNN,GRU,LSTM. 问题求解: 循环神经网络 RNN 传统的RNN是维护了一个隐变量 ht 用来保存序列信息,ht 基于 xt 和 ht- ...

  3. Java 入门学习知识点整理

    [JAVA一个文件写多个类 ( 同级类 ) 规则和注意点] 在一个.java文件中可以有多个同级类,  其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一 ...

  4. [简单路径] Useful Decomposition

    Ramesses knows a lot about problems involving trees (undirected connected graphs without cycles)! He ...

  5. ssm整合配置文件

    web.xml: <!-- 指定spring的配置文件的路径和名称 --> <context-param> <param-name>contextConfigLoc ...

  6. Keras 多层感知机 多类别的 softmax 分类模型代码

    Multilayer Perceptron (MLP) for multi-class softmax classification: from keras.models import Sequent ...

  7. 对于一个由0..n的所有数按升序组成的序列,我们要进行一些筛选,每次我们取当前所有数字中从小到大的第奇数位个的数,并将其丢弃。重复这一过程直到最后剩下一个数。请求出最后剩下的数字。

    输入描述: 每组数据一行一个数字,为题目中的n(n小于等于1000). 输出描述: 一行输出最后剩下的数字.我的思路是用两个链表,一个用于存储原数据,一个用于存储要丢掉的数据,再循环从元数据中剔除掉即 ...

  8. JavaScript/JQuery对图片放大或缩小失效

    将图片的父元素的宽度和高度也设置后,问题解决.Got it!

  9. linux下zip/unzip详解

    linux下zip_unzip详解 命令列表:zip    -q (quiet)    -r (recursive)    -0(level0-level9)    -e (encrypt)    - ...

  10. vue中通过修改element-ui的类修改相关组件的样式

    可以在App.vue中的style中修改element-ui的样式. 注意:一定要在属性值后面加上 !important 使自己定义的css样式处于权重最高,不加的话在本地调试的时候是没有问题的,不过 ...