2017-09-27 20:04:40 wqbku0016 阅读数 696
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10938 人正在学习 去看看 尹成

杂货

文本处理的三种操作:
1.解析数据并将数据放入程序内部的结构中
2.将数据以某种方式转换为另一种相似的形式,数据本身发生了改变
3.生成全新的数据

python类型检查方法:鸭子判断法
如果他走路像鸭子,叫声也像鸭子,那么对于我们的应用而言,就可以认为他是鸭子了。

python检错方式被称为事后原谅法(EAFP) try/except

python字符串拼接
python中字符串对象是无法改变的 所以任何字符串的操作都会产生一个新的对象 使用+=拼接会产生数量级个中间结果,所以最终的时间复杂度和字符串平方相关 使用join键入列表会免去中间的缓冲,只会产生一个字符的拷贝用于拼接

闭包
1。缓存 闭包总存在在内存中 不会自动释放 对于一些操作需要大量时间的函数可以保存下来
2。封装 实现数据的封装 使用闭包可以访问私有变量
3。面向对象中的单例模式

被绑定方法
如果一个python对象提供一个方法,可以直接获得一个已经绑定到该对象的方法,从而直接使用此方法。

总是在IO动作的关口做转换

python

”’ 多行链接
r/R 原生字符串
u/U 原字符串

字符串是无法改变的 进行操作时只是新建了一个新的字符串对象

字符串的切片
[-x:] 从末尾向前
切片扩展第三个参数 作为切片的步长 用于判断正向和反向

splitlines 分割多个单行字符串并置于列表中

ord() 字符转换成ASCII码
chr() ASCII码转换成字符

提取空格的正则表达式 r’(\s+)’
使用括号后默认保留了分割符
?:可以去掉某个符号

struct 中pack和unpack的使用
传入数据必须是byte形式
string 和 byte可以通过str() bytes()两种方法进行转化

zip
是一个表项合并函数 在python3中最后生成一个迭代对象 最后使用内建的list就可以 b
在 for循环中不存在这个问题

带列表推导LC
eg: fivers = [theline[k:k+5] for k in xrange(0, len(theline), 5)]

一种构建多引号的奇妙做法
market = ‘”’
b = ‘i love you’
b.join(market * 2)

PYTHON

shell 上运行 import this 便可查看

The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea – let’s do more of those!

2019-05-21 16:59:44 weixin_37659245 阅读数 190
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10938 人正在学习 去看看 尹成

最近越发感觉到限制我对Python运用、以及读懂别人代码的地方,大多是在于对数据的处理能力。
其实编程本质上就是数据处理,怎么把文本数据、图像数据,通过python读入、切分等,变成一个N维矩阵,然后再带入别人的模型,bingo~跑出来一个结果。结果当然也是一个矩阵或向量的形式。
所以说,之所以对很多模型、代码束手无策,其实还是没有掌握好数据处理的“屠龙宝刀”,无法对海量数据进行“庖丁解牛”般的处理。因此,我想以一个别人代码中的一段为例,仔细琢磨文本数据处理的精妙之处,争取能够加深对这方面的运用与理解。

1) 问题描述

数据:某个区域181天内的访客数据,格式如下,第一列代表访客的名称,第二列代表这位访客在181天内到达这片区域的时刻:
在这里插入图片描述
目的:将访客数据进行统计,并时间离散化,按照天 /周/小时处理为72624的三维矩阵。
也就是说,矩阵中的每一个值,代表该区域 周X、第几周、几点 的到访人数,如
[1,5,19]=100,代表第5周的周一晚上7点的人数为100。

2)难点

当然是对我的难点。

2.1)怎么按行统计

2.2)怎么进行时间离散化(存为天、周、时刻的矩阵)

3)代码

import time
import numpy as np
import sys
import datetime
import pandas as pd
import os
#用字典查询代替类型转换,可以减少一部分计算时间
date2position = {}
datestr2dateint = {}
str2int = {}
for i in range(182):
    date = datetime.date(day=1, month=10, year=2018)+datetime.timedelta(days=i)
    #print(i,":",date)
    date_int = int(date.__str__().replace("-", ""))
    date2position[date_int] = [i%7, i//7]
    datestr2dateint[str(date_int)] = date_int
#print(datestr2dateint)
#
for i in range(24):
    str2int[str(i).zfill(2)] = i
f=open("D:\BaiDuBigData19-URFC-master\\UrbanRegionFunctionClassification-master\data\\train_visit\\000000_008.txt")
#table = pd.read_csv(f, header=None,error_bad_lines=False)
table = pd.read_csv(f, header=None,sep='\t')

#print(table.shape)
#print(table.ix[1])
strings = table[1]
#print(strings)
init = np.zeros((7, 26, 24))
for string in strings:
    temp = []
    for item in string.split(','):
        temp.append([item[0:8], item[9:].split("|")])
    for date, visit_lst in temp:
        # x - 第几周
        # y - 第几天
        # z - 几点钟
        # value - 到访的总人数
       # print(visit_lst)
        print(date)
        x, y = date2position[datestr2dateint[date]]
        for visit in visit_lst: # 统计到访的总人数
            init[x][y][str2int[visit]] += 1
        #print(init[x][y][str2int[visit]])```

3.1)创建字典,时间离散化,节省时间

此处创建了三个字典,让我们看一下代码实现以及打印结果:

date2position = {}
datestr2dateint = {}
str2int = {}
for i in range(182):
    date = datetime.date(day=1, month=10, year=2018)+datetime.timedelta(days=i)
    #print(i,":",date)
    date_int = int(date.__str__().replace("-", ""))
    date2position[date_int] = [i%7, i//7]
    datestr2dateint[str(date_int)] = date_int
for i in range(24):
    str2int[str(i).zfill(2)] = i

打印一下 date2position:
在这里插入图片描述
打印一下 datestr2dateint:
在这里插入图片描述
打印str2int:
在这里插入图片描述
可以看出,datestr2dateint是将str的日期,转换为了int的日期。
而date2position 才是计算出的每一个具体的日期,代表了第几周、第几天。
str2int代表了一天中的24个时刻。

3.2)读取文件,按行获取字符串

注意到文本的分隔符为\t(区分用户名与到访信息的分割),于是采用

f=open("D:\BaiDuBigData19-URFC-master\\UrbanRegionFunctionClassification-master\data\\train_visit\\000000_008.txt")
#table = pd.read_csv(f, header=None,error_bad_lines=False)
table = pd.read_csv(f, header=None,sep='\t')

然后用strings读取到访信息,也就是table的第二列:

strings = table[1]

3.3)切分字符串

首先,strings为:
在这里插入图片描述
可以看到每一行string,为一个用户的到访记录,循环读取。其中,不同日期的到访是用“,”隔开,故要使用:

for string in strings:
    temp = []
    for item in string.split(','):

item就可以分开每一个日期的到访记录了:
在这里插入图片描述
其后,使用temp列表,每一行存储日期和时刻。
如第一个item为 20181221&09|10|11|12|13|14|15
日期为 item[0:8],
时刻之间使用分隔符“|”隔开,故可以通过item[9:].split("|")得到。

 temp.append([item[0:8], item[9:].split("|")])

打印一下temp为:
在这里插入图片描述
所以需要用两个数据分别存储日期,以及时刻。
首先用来转换成 周、天、时刻的72624矩阵(根据前面的转换函数)
其后根据这个矩阵,统计每一个位置的访客数量

    for date, visit_lst in temp:
        # x - 第几周
        # y - 第几天
        # z - 几点钟
        # value - 到访的总人数
       # print(visit_lst)
        #print(date)
        x, y = date2position[datestr2dateint[date]]
        for visit in visit_lst: # 统计到访的总人数
            init[x][y][str2int[visit]] += 1

这一段代码很短,但着实是整个时间离散化实现的精髓所在。

2017-11-01 00:53:33 laagyzz 阅读数 4474
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10938 人正在学习 去看看 尹成

要进行机器学习,先要有数据。数据集处理是机器学习的基础。本文将介绍如何利用 python 自带的 csv 模块进行一些简单的数据集处理。


任务

将指定的 semeval 文件按照规定格式处理成 .csv 文件。

seminal 文件预览如下图:

这里写图片描述

每一行数据集由三个 part 组成——序号、情感和文本;part 与 part 之间由 tab 键分开,每一个 part 内部文本由空格分开。
要求用 python 实现的 .csv 文件效果如下:

这里写图片描述


算法

解决这个问题的算法是相对简单的。首先我们输出最上方的表头,然后依次读入每行的内容,先按 \t 分割三个 part,然后对中间情感的 part 再分别按空格和冒号分割,取到后面的值。最后按要求输出即可。


代码实现

对于新手来说,解决这个问题的代码实现还是有一定难度的,需要我们对 python3 的文件读写、字符串处理和 csv模块有一定的了解。

首先先看一下最终的代码:

import csv

#print the header:
with open("new.csv", "w") as csvFile:
    fileheader = ["id", "text", 'all', 'anger', 'disgust', 'fear', \
                  'joy', 'sad', 'surprise']
    writer = csv.writer(csvFile)
    writer.writerow(fileheader)

with open('/path/semeval', 'r') as inputFile:
    currentLineContent = inputFile.readline()
    while(currentLineContent):
        part = currentLineContent.split('\t')

    #split in 3 parts:
        num = part[0]
        emo = part[1]
        text = part[2]

    #spilt different emotions:
        emo = emo.split(' ')
        csvall = emo[0].split(':')[1]
        anger = emo[1].split(':')[1]
        disgust = emo[2].split(':')[1]
        fear = emo[3].split(':')[1]
        joy = emo[4].split(':')[1]
        sad = emo[5].split(':')[1]
        surprise = emo[6].split(':')[1]

        with open("new.csv", "a") as csvFile:
            dict_writer = csv.DictWriter(csvFile, fileheader)
            dict_writer.writerow({"id":num, "text":text, 'all':csvall,\
                                  'anger':anger, 'disgust':disgust, 'fear':\
                                  fear, 'joy':joy, 'sad':sad, 'surprise':\
                                  surprise})
        currentLineContent = inputFile.readline()


读取文件

我们首先来看读取文件的部分:

with open('/Users/youzunzhi/Desktop/semeval', 'r') as inputFile:
    currentLineContent = inputFile.readline()
    while(currentLineContent):
        ...
        currentLineContent = inputFile.readline()

python 自带的 open()函数可以打开一个文件对象:
f = open('/path/file.txt', 'r')
其中'r' 表示用读文件的模式打开。此外还可以用:

  • 'w':写文件模式
  • 'a':在原文件后面添加的模式

以这样的方式打开文件成功后,文件对象会一直占用操作系统的资源,所以要用close()方法关闭这个文件:
f.close()

由于这样的方法过于繁琐还容易被忘记,python 提供了with语句来自动帮我们调用close()方法:

with open('/path/file.txt', 'r') as f:
    pass

打开文件后,就可以对文件进行操作了。如果文件很小,可以用read()直接读取,但如果文件很大的话内存就会直接爆掉了,所以这里我们用readline()方法一行一行的读取,直到读取结束,while的条件就会为 False了。


字符串处理

再来看字符串处理的部分:

    part = currentLineContent.split('\t')

    #split in 3 parts:
        num = part[0]
        emo = part[1]
        text = part[2]

    #spilt different emotions:
        emo = emo.split(' ')
        csvall = emo[0].split(':')[1]
        anger = emo[1].split(':')[1]
        disgust = emo[2].split(':')[1]
        fear = emo[3].split(':')[1]
        joy = emo[4].split(':')[1]
        sad = emo[5].split(':')[1]
        surprise = emo[6].split(':')[1]

python3 提供了 split()函数来分割字符串。使用后函数将会返回一个list,所以在按 \t 分割后我们先分别将得到的列表中的三个元素分别赋给 num,emo,和 text。然后继续按空格和冒号分割,最后分别取出分割后的列表的第二个值赋给各个情绪。


csv文本输出

最后我们利用 python3 自带的csv模块将数据集按要求输出成 .csv文件。

import csv

#print the header:
with open("new.csv", "w") as csvFile:
    fileheader = ["id", "text", 'all', 'anger', 'disgust', 'fear', \
                  'joy', 'sad', 'surprise']
    writer = csv.writer(csvFile)
    writer.writerow(fileheader)
...
with open("new.csv", "a") as csvFile:
    dict_writer = csv.DictWriter(csvFile, fileheader)
    dict_writer.writerow({"id":num, "text":text, 'all':csvall,\
                                  'anger':anger, 'disgust':disgust, 'fear':\
                                  fear, 'joy':joy, 'sad':sad, 'surprise':\
                                  surprise})

首先我们用csv中的writer函数中的writerow方法输出表头。

writer.writerow(fileheader)

对于后面的值,虽然也可以按顺序输出,但是这里我们再介绍一种DictWriter函数,它以词典的方式按照指定的 key 输出值,而不用担心顺序问题。

dict_writer = csv.DictWriter(csvFile, fileheader)

DictWriter函数也有writerow方法,参数是一个词典。

dict_writer.writerow({"id":num, "text":text, 'all':csvall,\
                                  'anger':anger, 'disgust':disgust, 'fear':\
                                  fear, 'joy':joy, 'sad':sad, 'surprise':\
                                  surprise})

至此,用 python3 处理文本数据集,并用 csv 格式输出的任务就完成了。

2018-07-04 15:20:32 happy5205205 阅读数 1038
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10938 人正在学习 去看看 尹成

1、文本基本操作

text1 = 'Python is a widely used high-level programming language for general-purpose programming, created by Guido van Rossum and first released in 1991.'
# 字符个数
print(len(text1))

# 获取单词
text2 = text1.split(' ')
print('单词个数:', len(text2))
# 找出含有长度超过3的单词
print([w for w in text2 if len(w) > 3])
# 找出首字母大写的单词
print([w for w in text2 if w.istitle()])
# 以字母s结尾的单词
print([w for w in text2 if w.endswith('s')])
# 找出不重复的单词
text3 = 'TO be or not to be'
text4 = text3.split(' ')
print('单词个数:', len(text4))
print('不重复的单词个数:', len(set(text4)))
# 忽略大小写统计
set([w.lower() for w in text4])
print(len(set([w.lower() for w in text4])))

2、 文本清洗

text5 = '            A quick brown fox jumped over the lazy dog.  '
text5.split(' ')
print(text5)
text6 = text5.strip()
print(text6)
text6.split(' ')
# 去掉末尾的换行符
text7 = 'This is a line\n'
text7.rstrip()
print(text7)

3、 正则表达式

text8 = '"Ethics are built right into the ideals and objectives of the United Nations" #UNSG @ NY Society for Ethical Culture bit.ly/2guVelr @UN @UN_Women'
print(text8)
text9 = text8.split(' ')
print(text9)
# 查找特定文本
# #开头的文本
print([w for w in text9 if w.startswith('#')])
# @开头的文本
print([w for w in text9 if w.startswith('@')])
# 根据@后的字符的样式查找文本
# 样式符合的规则:包含字母,或者数字,或者下划线
import re
print([w for w in text9 if re.search('@[A-Za-z0-9_]+', w)])
text10 = 'ouagadougou'
print(re.findall('[aeiou]', text10))
print(re.findall('[^aeiou]', text10))
2019-03-30 19:39:38 sinat_38682860 阅读数 131
  • Python-数据

    Python数据库编程视频教程,数据库是MySQL,讲解Python链接MySQL数据库,并对数据库进行增删改查操作。

    10938 人正在学习 去看看 尹成

这是我的Python用于自然语言处理(NLP)系列文章的第一篇文章。在本文中,我们将从Python for NLP的基础知识开始。我们将看到如何使用Python处理简单的文本文件和PDF文件。

处理文本文件

文本文件可能是你在NLP工作中遇到的最基本类型的文件。在本节中,我们将了解如何用Python读取文本文件,创建文本文件以及将数据写入文本文件。

阅读文本文件

使用以下文本创建一个文本文件,并使用“.txt”扩展名将其保存在本地目录中。

在我的例子中,我将名为“myfile.txt”的文件存储在我的D盘根目录中。

阅读文件的所有内容

现在让我们看看我们如何阅读文件的全部内容。第一步是指定文件的路径,如下所示:

要打开文件,你可以使用Python的内置open函数。如果你执行上面的代码并且没有看到错误,则表示你的文件已成功打开。确保将文件路径更改为保存文本文件的位置。

现在让我们看看myfile变量中存储了什么:

输出如下所示:

输出显示该myfile变量是myfile.txt文件的容器,并以只读模式打开文件。

如果指定了错误的文件路径,则可能会收到以下错误:

每当你得到Errno 2时,可能有两个原因。你的文件不存在或者你给open函数提供了错误的文件路径。

现在,让我们读一下该文件的内容。为此,你需要在myfile变量上调用read()函数,如下所示:

在输出中,你应该可以看到文件的文本,如下所示:

现在,如果你尝试再次调用read,控制台上将不会打印任何内容:

这是因为一旦调用该read方法,光标就会移动到文本的末尾。因此,当你再次调用read时,不会显示任何内容,因为已经没有更多要打印的文本了。

一个解决这个问题的方案就是在调用read()方法之后,调用seek()方法并使用0作为参数。

这会将光标移回文本文件的开头。查看以下代码以了解其工作原理:

在输出中,你将看到文本内容被打印了两次。

一旦完成文件处理后,关闭文件以便其他应用程序可以访问显得非常重要。为此,你需要调用close()方法。

逐行读取文件

我们也可以逐行读取文件内容,而不是一次读取文件的所有内容。为此,我们需要执行readlines()方法,该方法可以将文本文件中的每一行作为列表项返回。

在输出中,你将看到文本文件中的每一行都变为了列表项:

在多数情况下,这会使文本更容易相处。例如,我们现在可以轻松遍历每一行并打印行中的第一个单词。

输出如下所示:

写入文本文件

要写入文本文件,只需在打开文件时将打开模式设置为w或w+。前者在写入模式下打开文件,后者在读取和写入模式下打开文件。如果该文件不存在,则会创建该文件。值得一提的是,如果你以w或w+模式打开一个文件时,则将移除所有的文件内容,如下所示:

在输出中,由于使用w+模式打开文件,因此屏幕上不会显示任何内容,文件的所有内容都已被删除。你可以附加文字来避免这种情况,我也会在下面提到。

现在,让我们使用write()方法在文件中写一些内容。

在上面的脚本中,我们将文本写入文件,然后调用seek()方法将光标移回开始,然后调用read方法读取文件的内容。在输出中,你将看到新添加的内容,如下所示:

通常,你不需要删除文件的现有内容。相反,你可能需要在文件末尾添加内容。

为此,你需要以a+模式打开文件,该模式能够添加和读取文件内容。

再次创建一个包含以下内容的文件,并在D盘根目录中将其保存为“myfile.txt”:

执行以下脚本以使用添加模式打开文件:

在输出中,你将看到文件的内容。

接下来,让我们在文件中添加一些文本。

现在我们再次阅读文件内容:

在输出中,你将在文末看到新添加的行,如下所示:

最后,在继续下一节之前,让我们看看在执行所需操作后如何使用上下文管理器自动关闭文件。

使用with关键字,如上所示,你不需要明确关闭文件。相反,上面的脚本打开文件,读取内容,然后自动关闭它。

处理PDF文件

除了文本文件,我们还经常需要使用PDF文件来执行不同的自然语言处理任务。默认情况下,Python没有任何可用于读取或写入PDF文件的内置库。但是我们可以使用PyPDF2库。

在我们使用PyPDF2库之前,需要安装它。如果你使用pip安装程序,则可以使用以下命令安装PyPDF2库:

或者,如果你使用的是Anaconda环境中的Python,则可以在conda命令提示符下执行以下命令:

注意:这里需要提到的是PDF文档可以从不同的来源创建,如word文档,图像等。在本文中,我们将只处理使用word文档创建的PDF文档。对于使用图像创建的PDF文档,还有其他专门的库,我将在后面的文章中解释。目前,我们只使用使用word文档生成的PDF文档。

作为可以使用的虚拟文档,你可以从以下链接下载PDF:http://www.bavtailor.com/wp-content/uploads/2018/10/Lorem-Ipsum.pdf

将下载的文档保存在D盘根目录下。

阅读PDF文档

要阅读PDF文档,首先,我们必须要像其他普通文件一样打开它。使用以下脚本:

值得一提的是,在打开PDF文件时,必须将模式设置为“读取二进制”的rb模式,因为大多数PDF文件都是二进制格式。

打开文件后,我们需要调用PyPDF2库中的PdfFileReader()函数,如下所示:

现在使用pdf_document变量,我们可以执行各种读取功能。例如,要获取PDF文档中的总页数,我们可以使用以下numPages属性:

由于我们只有一页文档,在我们的PDF文档中,你将在结果中看到1。

最后,要从PDF文档中提取文本,首先需要使用getPage()函数获取PDF文档的页面。

接下来,你可以调用extractText()函数从特定页面中提取文本。

以下脚本从PDF的第一页中提取文本,然后将其打印在控制台上。

在结果中,你应该看到PDF第一页中的文本。

写入PDF文档

由于字体和其他约束,无法使用PyPDF2库直接将Python字符串写入PDF文档。但是,为了演示,我们将从PDF文档中读取内容,然后将该内容写入我们将创建的另一个PDF文件。

让我们首先阅读PDF文档第一页的内容。

上面的脚本读取了我们PDF文档的第一页。现在,我们可以使用以下脚本将第一页中的内容写入新的PDF文档:

上面的脚本创建了一个可用于将内容写入PDF文件的对象。首先,我们将向这个对象添加一个页面,并将我们从另一个PDF中检索到的页面传递给它。

接下来,我们需要打开一个具有wb(写二进制)权限的新文件。打开具有此类权限的文件会创建一个新文件,如果文件不存在的话。

最后,我们需要在PDF编写对象上调用write()方法并将新创建的文件传递给它。

关闭mypdf和pdf_output_file文件,然后转到程序的工作目录。你应该在编辑器中看到一个新文件new_pdf_file.pdf。打开文件,你应该看到它包含来自原始PDF的第一页的内容。

让我们尝试阅读新创建的PDF文档的内容:

现在让我们使用一个更大的PDF文件。从以下链接下载PDF文件:

http://ctan.math.utah.edu/ctan/tex-archive/macros/latex/contrib/lipsum/lipsum.pdf

将其保存在本地目录中。下载文件的名称为“lipsum.pdf”。

更多Python视频、源码、资料加群984632579免费获取

执行以下脚本查看文件中的页数:

在输出中,你将看到打印出87,因为该PDF中有87页。让我们在控制台上打印文档中的所有页面:

在输出中,你将看到打印在屏幕上的PDF文档的所有页面。

结论

阅读和编写文本文档是开发自然语言处理应用程序的基本步骤。在本文中,我们解释了如何使用Python处理文本和PDF文件。我们看到了如何读写文本和PDF文件。在下一篇文章中,我们将开始讨论其他一些NLP任务,例如使用spaCy库进行词干化,词形还原化,标记化。

英文原文:https://stackabuse.com/python-for-nlp-working-with-text-and-pdf-files/ 

译者:狼行千里吃鸡

python数据处理

阅读数 645

python处理xml数据

阅读数 2161

Python数据处理

阅读数 200

没有更多推荐了,返回首页