首先先确定xml文件有两个特点容易忽视,
1、xml文件有且只有一个根节点
2、xml文件的标签的属性都有引号“”
由于对xml文件不熟,并且对python处理xml文件不熟,故这两个坑用了将近一天的时间来填,谨记
说到填坑,要特备感谢一驻马店的老乡“驻马店bd”qq已备注。不是他的帮助,估计还要整好长时间。特此感谢,虽然他看不到。
那么我处理的文件到底什么样子呢,请看图:
就这这么个德行,一缺少根节点(在文件开头结尾补上即可),二标签的属性缺少引号(使用正则表达式在id=x加上引号就行了id=”x”)。
(自强不息)
——————————————————————————————————————————————
2017.02.19记录
记得有点乱哈。
这次总结下,我之所以要一直使之成为合法的xml文件,是因为我要提取xml文件里面的属性。可能转的圈有点大。但是目前我也没什么好的办法。先按着这个方法来呗。
要想成为一个合法的xml文件,除了满足上面的两点,还有一点也要满足
即属性里不能有特殊的字符(如<>、&、()等等不知道的字符)。有的话,就没办法当成一个xml文件进行解析。所以要去掉这些字符。这里我选择使用正则表达式去匹配去除。
下面贴出两个解析正常xml(读取xml)文件的代码:
先来两个参考链接:
http://www.runoob.com/python/python-reg-expressions.html
http://www.cnblogs.com/linyawen/archive/2012/03/28/2420649.html
——————————————————————————————————————
以下是2017.02.20记录
经历过这近三天的经历,我突然意识到也许作者在写这个文件时,就不是按照xml格式来写的,导致按照xml文件格式来处理千难万难。这样的判断来自以下两点:
1、加入是合法的xml文件,那么这个标签的属性里面就不会包含尖括号<>等这样的非法字符。
2、按照xml文件来处理,这样的非法字符很多。
综上所述,这个文件不能按照xml文件来处理。
今天突然灵感一来,我决定直接提取我想要的标签属性:
代码是re+++.py
这个代码实现了从类xml文件中(如上图格式)提取出标签属性。
代码上传至(待定)
# -*- coding: utf-8 -*-
#
# Copyright @2017 R&D, CINS Inc. (cins.com)
#
# Author: PengjunZhu <1512568691@qq.com>
#a5a
# Function:提取出原始文件中的sunmary和short_text,将每一个human_label、summary和short_text分词后写在一行
#
# time: 2017.02.20
# 提取 line中的xx
# result0 = re.findall("XX",line) # 这里的XX代表你要提取的某种格式的符号
# print result0[0] # 将提出出来的xx写到屏幕上
#
import re
import jieba.posseg as pseg
import jieba
path1 = 'D:/LCSTS/DATA/PART_I.txt'
path2 = 'D:/LCSTS/DATA1/PART_I_comb.txt'
file1 = open(path1, 'r')
file2 = open(path2, 'w')
# file2.write('<ddoc>'+'\n')
i = 0
print '程序开始'
print '程序运行中...'
for line in file1:
if '</short_text>' in line: #一个文本换一行
# print 'true'
file2.write('\n')
if '<doc id=' in line:
id = re.findall("\d+",line)
# print '文本id是:',id[0]
# file2.write(id[0]+"##")
if '<human_label>' in line:
score = re.findall("\d+",line)
# print '人工打标签的分值:',score[0]
file2.write(score[0]+" ")
regex = re.compile(u'[\u4e00-\u9fa5]') #匹配有中文字符的行
match = regex.search(line.decode('utf-8')) #match是一个布尔值,1代表匹配到了。0代表没有
if match:
line1 = re.sub("<.*?>","",line)
line1 = line1.strip()
line2 = line1.decode('utf-8', 'ignore') #将获取的字符串line1做decode时,指明ignore,会忽略非法字符,这样就可以了
words = jieba.cut(line2) # 分词
line2 = " ".join(words).encode('utf-8')
# print line2
i += 1
# words = pseg.cut(line1) # 分词+词性标注
# for word, flag in words:
# print word +'/'+ flag
file2.write(line2+" ")
else:
pass
print i
file1.close()
# file2.write('</ddoc>'+'\n')
file2.close()
print '程序结束'