SemEval2014数据集预处理:cElementTre。。。
在做Aspect-level情感分类时⼀般会⽤到SemEval 2014数据集。官⽹给的数据集都是XML格式,我们要对其进⾏解析。
⾸先看⼀下数据结构。
⼀个XML⽂件⾥包含多个sentence,每个sentence⾥包含text、aspectCategories和aspectTerms⼦节点,即我们需要提取出来的内容。
下⾯是代码。
⾸先,导⼊库。
cElementTree as ET
python处理xml文件Python标准库中,提供了ElementTree的两种实现。⼀个是纯Python实现的ElementTree,另⼀个是速度更快的C语⾔实现的cElementTree。第⼆种速度更快,⽽且内存消耗较少。
接下来读⽂件,获取根节点。
path ='l'
tree = ET.parse(path)
root = t()
⼦节点是嵌套的,我们可以通过索引访问特定的⼦节点。
如:
root[0][0].text
输出是第⼀个sentence中text节点的内容。
然后获取XML中的元素,保存到数组中即可。
获取aspectCategory
data =[]
for sentence in root.findall('sentence'):
text = sentence.find('text').text
aspectCategories = sentence.find('aspectCategories')
for aspectCategory in aspectCategories.findall('aspectCategory'):
category = ('category')
polarity = ('polarity')
data.append((text, category, polarity))
Element.findall(): 只到带有标签的元素,该标签是当前元素的直接⼦元素。
Element.find() :到第⼀个带有特定标签的⼦元素。
<:访问标签的内容
<():访问标签的属性值
也可以转化成dataframe,保存到csv⽂件⾥。
df=pd.DataFrame(data,columns=['text','category','polarity'])
<_csv('data/data.csv',sep=' ')
df.head()
提取aspectTerms
提取aspectTerms和提取aspectCategories有⼀点不同,即并不是每个sentence都有aspectTerms节点,因此我们不能直接查所有sentence的aspectTerms节点。那么解决⽅法是什么呢。这⾥就要⽤到强⼤的xpath表达式了,’.//aspectTerms/…'的含义是选择所有包含aspectTerms的sentence节点,其中“//”表⽰从匹配选择的当前节点选择⽂档中的节点,⽽不考虑它们的位置。“…”表⽰选择当前节点的⽗节点。
data=[]
for sentence in root.findall('.//aspectTerms/..'):
text = sentence.find('text').text
aspectTerms=sentence.find('aspectTerms')
for aspectTerm in aspectTerms.findall('aspectTerm'):
term = ('term')
polarity = ('polarity')
data.append((text, term, polarity))
df = pd.DataFrame(data,columns=['text','term','polarity'])
df = df[df['polarity'].isin(['positive','negative','neutral'])]
df['polarity']= df['polarity'].map(
{'positive':1,'neutral':0,'negative':-1})
<_csv('data/aspect_term.csv', sep=' ',index=0)
df

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。