数据预处理流程:
使用数据的来源:
使用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()