跨语言情感分类之数据预处理

数据预处理流程:

使用数据的来源:

使用NLP&&CC2013比赛的数据(http://tcci.ccf.org.cn/conference/2013/pages/page04_sam.html),其中包括中文有标签数据(每类20条正例20条负例),英文有标签数据(每类2000条正例2000条负例)和中文无标签数据(47071条book的review)。其中包括三类,分别是book、DVD、music的Amazon评论。格式为XML,需要解析。

解析XML:

使用xml.sax解析xml,并使用jieba分词工具对中文进行分词。

xml.sax需要创建一个包含处理元素开始事件的函数startElement(self,tag,attributes),元素结束事件的函数endElement(self,tag)和处理标签之间内容的函数characters(self,content)。

jieba.cut(str)返回一个分词后的list。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 27 11:12:10 2018

@author: zilla
"""
import xml.sax
import jieba
import pandas as pd
train_cn_book = []

class reviewHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.review_id = ""
      self.summary = ""
      self.polarity = ""
      self.text = ""
      self.category = ""
 
   # 元素开始事件处理
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "item":
         print("*****review item*****")
 
   # 元素结束事件处理
   def endElement(self, tag):
      if self.CurrentData == "review_id":
         print("review_id:", self.review_id)
      elif self.CurrentData == "summary":
         print("summary:", self.summary)
      elif self.CurrentData == "polarity":
         print("polarity:", self.polarity)
      elif self.CurrentData == "text":
         print("text:", self.text)
      elif self.CurrentData == "category":
         print("category:", self.category)
      elif tag == "item":
         print('item close')
#         unlabel_cn_book.append({'review_id':self.review_id,'summary':self.summary,'polarity':self.polarity,'text':self.text,'category':self.category,'words':list(jieba.cut(self.text))}) 
         train_cn_book.append({'review_id':self.review_id,'summary':self.summary,'polarity':self.polarity,'text':self.text,'category':self.category,'words':list(jieba.cut(self.text))}) 
      self.CurrentData = ""
 
   # 内容事件处理
   def characters(self, content):
      if self.CurrentData == "review_id":
         self.review_id = content
      elif self.CurrentData == "summary":
         self.summary = content
      elif self.CurrentData == "polarity":
         self.polarity = content
      elif self.CurrentData == "text":
         self.text = content
      elif self.CurrentData == "category":
         self.category = content
  

def parse(filePath):   
   # 创建一个 XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0) 
   # 重写 ContextHandler
   Handler = reviewHandler()
   parser.setContentHandler( Handler )   
   parser.parse(filePath)
   
def all_words(sen):
    allwords = []
    for item in sen:
        allwords.extend(item['words'])
    return allwords

parse("data/train_cn_book.data")
#chiesewords=all_words(train_cn_book)
#englishwords=all_words(train_en_book)
#cn_times= pd.Series(chinesewords).value_counts()
#en_times=  pd.Series(englishwords).value_counts()


    

翻译:

利用百度翻译的api对未标记数据中文数据进行翻译。

先将数据用上面提到的方法解析然后使用百度翻译的api。

百度翻译api的文档:http://api.fanyi.baidu.com/api/trans/product/apidoc

首先需要在http://api.fanyi.baidu.com/api/trans/product/index注册登录并且创建项目获取appid和秘钥。

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 27 15:59:20 2018

@author: zilla
"""
#translate.py 
import hashlib  
import urllib.request  
import json


appid = "**********************"
secretKey = "------------------"
 
##加密英文  
def md5en(str):  
    m = hashlib.md5()    
    m.update(str.encode(encoding='utf-8'))   
    md5value=m.hexdigest()  
    return md5value  
  
  
##加密中文  
def md5zh(str):  
    m = hashlib.md5()    
    m.update(str.encode(encoding='gb2312'))   
    md5value=m.hexdigest()  
    return md5value  
#翻译成中文  
def autoTozh(q):  
    ##拼接加密字符串  
    str = appid + q + "1435660288"+secretKey;  
    sign=md5en(str)  
    ##拼接url  
    url="http://api.fanyi.baidu.com/api/trans/vip/translate?q="+urllib.parse.quote(q)+"&from=auto&to=zh&appid=appid&salt=1435660288&sign="+sign  
    #print(url)  
    response = urllib.request.urlopen(url).read().decode('utf8')  
    #print(response)  
    getJson = json.loads(response)  
    #print(getJson)  
    getInfo = getJson['trans_result']  
    #print(getInfo)  
    s=getInfo[0]  
    re=s['dst']  
    #print(s)  
    print(re)  
    return re  
  
#翻译成英文  
def autoToen(q):  
    ##拼接加密字符串  
    str = "2015063000000001" + q + "143566028812345678";  
    sign=md5en(str)  
    #print(sign)  
    ##拼接url  
    #URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。 所以 URL 中使用其他字符就需要进行 URL 编码。  
    url="http://api.fanyi.baidu.com/api/trans/vip/translate?q="+urllib.parse.quote(q)+"&from=auto&to=en&appid=appid&salt=1435660288&sign="+sign  
    #print(url)  
    response = urllib.request.urlopen(url).read()  
    response=response.decode('utf-8')  
    print(response)  
    getJson = json.loads(response)  
    print(getJson)  
    getInfo = getJson['trans_result']  
    #print(getInfo)  
    s=getInfo[0]  
    re=s['dst']  
    #print(s)  
#    print(re)  
    return re  
   

使用方式:

import translate as tl
print(tl.autoToen('我爱你'))

统计词出现的次数:

def all_words(sen):
    allwords = []
    for item in sen:
        allwords.extend(item['words'])
    return allwords

chiesewords=all_words(train_cn_book)
englishwords=all_words(train_en_book)
cn_times= pd.Series(chinesewords).value_counts()
en_times=  pd.Series(englishwords).value_counts()



猜你喜欢

转载自blog.csdn.net/guijieling/article/details/79717517
今日推荐