一,语料(Corpus)

语料库即各个文档文章的集合。收集语料库后,要进行文本预处理,比如:文本分词, 英文字母全部转为小写,删除停用词,计算词频,删除低频词等。

1  分词

(1)英文文本分词

(2)中文文本分词,利用jieba工具

安装:pip install jieba

jieba介绍:https://github.com/fxsjy/jieba

jieba.cut(text)普通分词#想要一些词不要分开,可以加载自定义词典
file_userDict='dict.txt'
jieba.load_userdict(file_userDict)

2  停用词

停用词就是一些无关紧要的词,比如中文里的 “的”,“哦”。英文里的“yeah”, “oh”。可以网上下载别人已经整理好的停用词,根据自己的任务需要去修改一下就行。停用词也可以去标点符号。

网上下载的英文停用词文档:

网上下载的中文停用词文档:中文停用词表: 中文停用词表:百度停用词列表、哈工大停用词表、四川大学机器智能实验室停用词库、中文停用词库、stopword

去停用词后,进行分词的示例:(注意一下文件的编码方式,要和utf-8保持一致,不一致的话,另存为一下,选择utf-8格式保存)

3  计算词频

用下面这个方法创建字典,统计词频,特别好用。用defaultdict创建字典,当键值不存在,也不会报错,更简便。

#计算词频
from collections import defaultdict
frequency = defaultdict(int)
for text in texts:for token in text:frequency[token] += 1

4   仅保留词频数高于1的词汇

#仅保留词频数高于1的词汇
processed_corpus=[[word for word in text if frequency[word]>1]for text in texts ]
print(processed_corpus)

5   将语料库中的每个词汇与唯一的整数ID相关联,这里使用gensim.corpora.Dictionary这个类来完成。

最终代码:

import jieba
from collections import defaultdict#创建停用词列表
stoplist= [line.strip() for line in open('stopword.txt',encoding='UTF-8').readlines()]filename='分词前.txt'
outfilename='分词后.txt'
inputs=open(filename,'r',encoding='UTF-8')
outputs=open(outfilename,'w',encoding='UTF-8')#每一行语句都通过jieba分词,并且每个单词之间通过空格隔开。
raw_corpus=[' '.join(jieba.lcut(line.strip())) for line in inputs]
print(raw_corpus)#将文档中可能存在的英文字符小写化,按空格进行拆分,且去停用词
#注意格式,这里是二维列表了。
texts = [[word for word in document.lower().split() if word not in stoplist]for document in raw_corpus]#计算词频
frequency=defaultdict(int)
for text in texts:for token in text:frequency[token]+=1#仅保留词频数高于1的词汇
processed_corpus=[[word for word in text if frequency[word]>1]for text in texts ]
print(processed_corpus)#可以记录到文档里。
#write() argument must be str, not list
outputs.write(str(processed_corpus))
outputs.close()
inputs.close()#将语料库中的每个词汇与唯一的整数ID相关联。使用gensim.corpus.Dictionary这个类来完成。
from gensim import corporadictionary=corpora.Dictionary(processed_corpus)
print(dictionary)

参考文章:《Social Listening与文本挖掘》

二, 向量空间

1,词袋模型

很多不同文本表示方法,比如TF-IDF, LSA, LSI,LDA,HDP,NMF, Word2vec等。

将文档文本表示为向量,其中一个简单的方法就是词袋模型(Bag-of-Words Model)。

缺点:词袋模型完全忽略了文档中的词汇顺序。

首先看一下单词库(没有重复单词)中每个单词对应的ID:

print(dictionary.token2id)

假如想要对“报刊有图书和文章的出版物”这个语句进行向量化,(该语句不在原来的语料库中)。可以使用dictionary.doc2bow()方法,为该语句创建词袋表示,该方法返回  词汇ID和计数 的稀疏表示。

new_doc='报刊 有 图书 和 文章 的 出版物'
new_vec=dictionary.doc2bow(new_doc.lower().split())
print(new_vec)

每个元组中的第一个元素对应字典中的词汇ID,第二个元素对应于词汇的计数。

注意,原始语料库中没有“有”“和”,所以他们将不被包含在新生成的向量表示中。未参与向量化的词汇会直接被剔除,以节省空间。

将整个原始语料库(指分好词,预处理好的)转换为向量列表:

#将整个原始语料库转为词袋模型向量列表
bow_corpus=[dictionary.doc2bow(text) for text in processed_corpus]
print(bow_corpus)#这样打印的更好看,一句一句的
for c in bow_corpus:
print(c)

三, 模型

之前已经对 语料库 进行了向量化,现在可以使用模型model 对其进行转换了。

在gensim中, 文档表示为向量, 所以模型model 指的就是 两个向量空间 的转换。

一个简单的模型就是TF-IDF。

TF-IDF模型 将向量 从词袋频率计数表示 转换为加权值向量空间。其中,频率计数 根据语料库中每个单词的相对稀有度 进行加权。(出现次数少,越重要)

TF-IDF模型返回 元组列表,每个元组的第一个元素是词汇ID,第二个元素是TF-IDF的加权值。

gensim提供了许多不同的模型转换。

举例:

初始化tf-idf模型,在语料库上进行训练,然后对新来的一句话“报亭有图书和文章的出版物”进行转换。

#将词袋模型频率计数  转为 TF-IDF加权值 向量空间
from gensim import models
tfidf=models.TfidfModel(bow_corpus)
print(tfidf[dictionary.doc2bow('报刊 有 图书 和 文章 的 出版物'.split())])

四,语料库流---每次仅调用一个文档(我之前就是这么做的,这里再写一次是为了内容的连贯性)

将文档存储在本地的单个文件中,每行一个文档。Gensim只要求语料库在使用时,能够一次返回一个文档向量。

假设一行一个文档,用jieba分词。实例化对象后,corpus_memory_friendly是一个对象,因为有yield, 里面的函数相当于生成器了,而不是一个函数。在没有遇到next函数前,不会执行。所以打印print(corpus_memory_friendly), 只会打印一个对象在内存中的地址。

from smart_open import smart_open
class MyCorpus(object):def __iter__(self):for line in smart_open('分词前.txt','r',encoding='utf-8'):yield dictionary.doc2bow(' '.join(jieba.lcut(line)).lower().split())
corpus_memory_friendly=MyCorpus() #不需要将语料载入到内存中
print(corpus_memory_friendly)

要查看其向量构成,需要遍历语料库,并打印每个文档向量(一次一个)。因为for循环里有next函数,每次执行一次返回一个文档向量。(yield不仅是生成器的作用,还具有return的意思,iter函数里每读一条文档line,yield就返回一条文档向量,然后程序停止。yield会下次迭代在上次停止的地方继续运行。因为for vector in corpus_memory_friendly,一致for循环,所以可以打印出所有的文档向量)

for vector in corpus_memory_friendly:print(vector)

这样的语料库对内存更友好,一次最多只有一个向量驻留在RAM中,现在语料库想用多大就用多大。

from pprint import pprint #使得打印的格式更齐整

五, 这里讲一下用字典ID来过滤停用词和词频为1的词汇的方法。

用gensim库中的ID来方便的去掉停用词和低频词。dictionary.filter_tokens可以删除词汇id序列中的间隙,空置的占位符会被剔除。


from six import iteritems
from smart_open import smart_open
#收集所有词汇的统计信息
dictionary = corpora.Dictionary(' '.join(jieba.lcut(line)).lower().split() for line in smart_open('datasets/mycorpus.txt', 'r',encoding='utf-8'))#停用词和低频词(这里指仅出现1次的词汇)的ID集合
stop_ids = [dictionary.token2id[stopword] for stopword in stoplist
if stopword in dictionary.token2id]
once_ids = [tokenid for tokenid, docfreq in iteritems(dictionary.dfs) if docfreq == 1]#真正实施去停用词和低频次的操作
dictionary.filter_tokens(stop_ids + once_ids)
print(dictionary)

六, 语料格式(Corpus Formats)

有几种用于将向量空间语料库(向量序列)序列化到本地的文件格式。

Gensim通过前面的提到的流式语料库接口实现:从本地读取大量语料,一次一个文档,而不是一次性将整个语料库读入本地内存中,这种方式在语料库极为庞大时还是很折腾电脑。因此需要一个好的文件保存格式。

有一个好的文件格式:Matrix Market格式,可读性很强,促进数据交流。

(Matrix Market: File Formats)

下面,将文档以Matrix Market格式保存:

import logging
import os
import tempfile
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s', level=logging.INFO)
TEMP_FOLDER=tempfile.gettempdir()
print('文件夹“{}”将用来被存储语料和临时性的字典'.format(TEMP_FOLDER))
#创建一个包含2个文档的微小语料,以一个python列表呈现
corpus = [[(1, 0.5)], []]  # 其中一个文档故意搞成空的.比如将词袋模型的语料保存到本地。
corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.mm'), corpus)

其他的存储格式还有SVMlight format, LDA-C format, GibbsLDA++ format.


corpora.SvmLightCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.svmlight'), corpus)
corpora.BleiCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.lda-c'), corpus)
corpora.LowCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.low'), corpus)

反向操作,从Matrix Market文件中加载语料库迭代器(Corpus Iterator):

corpus = corpora.MmCorpus(os.path.join(TEMP_FOLDER, 'corpus.mm'))

语料库对象时流式的(streams), 因此通常无法直接打印,只能通过遍历才能看到其中的元素。

print(list(corpus))#调用 list() 能将任何序列转化为普通的Python list

或者这样:

# 另一种方法:一次打印一个文档
for doc in corpus:
print(doc)

接下来,以Blei的LDA-C格式保存相同的Matrix Market文档流:

corpora.BleiCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.lda-c'), corpus)

通过这种方式,gensim也可以用作内存高效的 I/O格式转换工具:只需要一种格式加载文档流,然后立即以另一种格式进行保存。

七, 与Numpy, SciPy的兼容性

Gensim 还囊括了许多高效实用的函数,可以在(matutils – Math utils — gensim)看到,通过这些函数,可以轻松的进行numpy矩阵的转换。

import gensim
import numpy as np
numpy_matrix = np.random.randint(10, size=[5,2])
pprint(numpy_matrix)
corpus = gensim.matutils.Dense2Corpus(numpy_matrix)
numpy_matrix_dense = gensim.matutils.corpus2dense(corpus, num_terms=10)
pprint(numpy_matrix_dense)

与scipy.sparse矩阵 相互转换:

import scipy.sparse
scipy_sparse_matrix = scipy.sparse.random(5,2)
pprint(scipy_sparse_matrix)
corpus = gensim.matutils.Sparse2Corpus(scipy_sparse_matrix)
print(corpus)
scipy_csc_matrix = gensim.matutils.corpus2csc(corpus)pprint(scipy_csc_matrix)

本章小结代码:

#设置日志,打印程序运行中的细节
import logging
logging.basicConfig(format='%(asctime)s: %(levelname)s : %(message)s', level=logging.INFO)
#工作路径查询
import tempfile
import os
TEMP_FOLDER=tempfile.gettempdir()
print('文件夹"{}"将被用来存储语料和临时性的字典'.format(TEMP_FOLDER))
###########对语料进行预处理######
###########预处理操作有:分词,移除停用词,移除低频词#######
#从语料文件中按行读取原数据,处理完毕后,存储预处理后的语料.#每一行语句都通过jieba分词,并且每个单词之间通过空格隔开。
#语料文件中通过” “,” “,分成一句一句的话(即一个一个的文档),否则会认为是一段话(一篇文档)。
import jieba
texts_cuted=[' '.join(jieba.lcut(line.strip()))for line in open('分词前.txt','r',encoding='UTF-8').readlines()]#移除停用词
stoplist=[line.strip() for line in open('stopword.txt','r',encoding='utf-8').readlines()]
texts=[[word for word in document.lower().split() if word not in stoplist]for document in texts_cuted]
print(texts)#计算词频,保留词频数高于1的词汇
from collections import defaultdict
frequency=defaultdict(int)
for text in texts:for token in text:frequency[token]+=1
print(frequency)
#这里的word不能用token,别大意。
processed_corpus=[[word for word in text if frequency[word]>1]for text in texts]
print(processed_corpus)
#保存预处理后的语料
outputs=open('预处理后的语料.txt','w',encoding='utf-8')
outputs.write(str(processed_corpus))
outputs.close()
#################################################
#创建字典,将语料库中的词汇与ID对应。
from gensim import corpora
dictionary=corpora.Dictionary(processed_corpus)
print(dictionary)
#保存字典
dictionary.save(os.path.join(TEMP_FOLDER,'deerwester.dict'))
##################################################
#创建词袋模型,将多个文档转换为向量。每个文档由一个向量表示。
corpus=[dictionary.doc2bow(text) for text in processed_corpus]
for c in corpus:print(c)
#保存词袋模型到本地,格式为Matrix Marker格式(而不是普通的txt格式了)。
corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'corpus.mm'), corpus)

NLP学习-1--语料预处理与向量空间,语料格式相关推荐

  1. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing..

    一.NLP标注工具 来源:<构想:中文文本标注工具(附开源文本标注工具列表)> Chinese-Annotator   来源:https://github.com/crownpku/Chi ...

  2. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing....

    from: https://blog.csdn.net/sinat_26917383/article/details/54908389 一.NLP标注工具 来源:<构想:中文文本标注工具(附开源 ...

  3. 【图像标注】NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing

    因为不太会使用opencv.matlab工具,所以在找一些比较简单的工具.  .  . 一.NLP标注工具BRAT BRAT是一个基于web的文本标注工具,主要用于对文本的结构化标注,用BRAT生成的 ...

  4. 【NLP】3000篇搜狐新闻语料数据预处理器的python实现

    3000篇搜狐新闻语料数据预处理器的python实现 白宁超 2017年5月5日17:20:04 摘要: 关于自然语言处理模型训练亦或是数据挖掘.文本处理等等,均离不开数据清洗,数据预处理的工作.这里 ...

  5. 深度学习数据集标注工具、图像语料数据库等资源

    NLP+VS︱深度学习数据集标注工具.图像语料数据库.实验室搜索ing... 2017年02月07日 12:12:01 阅读数:27032 ~~因为不太会使用opencv.matlab工具,所以在找一 ...

  6. python语料处理_Python中文语料批量预处理手记

    手记实用系列文章: 语料预处理封装类: #coding=utf-8 import os import jieba import sys import re import time import jie ...

  7. python-----简单英文语料预处理

    英文语料预处理的主要步骤: (此步骤针对的是txt格式的文件,如果文件为其他格式,需要先将其转换为txt文件再进行操作) 1.去除非英文字符的字符,例如符号.数字.中文等 2.去停用词 具体实现(py ...

  8. 曝!BAT大厂NLP学习进阶之法~

    "语言理解是人工智能领域皇冠上的明珠." --比尔盖茨 自然语言处理是一门综合性的学问,它远远不止机器学习算法.相比图像或语音,文本的变化更加复杂,例如从预处理来看,NLP 就要求 ...

  9. Task02:学习笔记文本预处理;语言模型;循环神经网络基础

    Task02:学习笔记文本预处理:语言模型:循环神经网络基础 文本预处理 文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤: 读入文本 ...

最新文章

  1. [转载] C#面向对象设计模式纵横谈——12. Flyweight享元模式
  2. Java开发与技术挑战——关于技术的技术思考
  3. 1、MySQL日志及分类
  4. 这可能是关于Pytorch底层算子扩展最详细的总结了!
  5. 好久没敲代码了(强行补上今天的博客。。。)
  6. php如何编造简历,在简历里编造内容需要注意哪些问题?
  7. idea启动tomcat没有加载项目_震惊!我三步就搞定了 Tomcat 源码环境搭建!
  8. 开源 协作工具_城镇如何使用开源工具进行协作和管理大文件
  9. git github配置
  10. Mysql 在linux下的安装和启动
  11. Redhat Linux Enterprise Server 5.5 x86_64位操作系统Karachi时区问题?
  12. 网络操控软件兴起:思科利润率受压
  13. Android友盟分享7.1.5版本巨坑
  14. 谷歌浏览器文件下载了缓存的问题与解决方案
  15. Maven clean基本命令
  16. [NOI2021] 密码箱——连分数、动态DP
  17. 如何使用FSMC让OLED屏幕刷新率飞起来?
  18. VUX--小白初学使用安装
  19. 位(bit)、字节(Byte)、MB(兆位)之间的换算关系
  20. z370完美黑苹果_完工!搞掂i5-8600K 华硕PRIME Z370-P GTX 1060黑苹果安装

热门文章

  1. 新闻学应该掌握哪些计算机技能,哪些人适合学新闻学专业 要掌握哪些技能
  2. 笔记本nc10装linux,三星nc10笔记本快捷键驱动
  3. error: (-5:Bad argument) in function ‘seamlessClone‘ 和error: (-215:Assertion failed) 0 <= roi.x 0
  4. 书评与摘抄《经济学原理》
  5. 【百元钱买百只鸡问题】一只公鸡5元钱,一只母鸡3元钱,三只小鸡1元钱。要求100元买100只鸡,请给出所有可行的结果?
  6. 湖北一考生将高考数学题上传小猿搜题事件网络舆情综合编报
  7. ios开发:UINavigationController反方向滑动push
  8. 【线性代数】上三角矩阵/下三角矩阵
  9. Redis 12 持久化
  10. java实现二维码扫码下载APP