法律状态公告日
法律状态信息
法律状态
2018-05-25
授权
授权
2016-04-13
实质审查的生效 IPC(主分类):G06F17/22 申请日:20151105
实质审查的生效
2016-03-16
公开
公开
技术领域
本发明涉及水印的嵌入与提取技术,尤其涉及一种基于主谓语编码的文本水印嵌入以及提取方法。
背景技术
随着互联网和信息技术的普及应用,文本信息越来越多的以数字的方式发布、传播和使用,它在给人们的学习、工作和生活带来便利的同时,也产生了文本容易被非法复制和盗用等问题,数字文本的知识产权保护受到业界的广泛关注。文本水印是近年来出现的保护数字文本知识产权的一项技术,它通过某种方式在数字文本中嵌入版权标识信息或身份认证信息(水印),当发现文本遭到非法复制或盗用时,可以提取这些信息来证明文本的版权归属,确认非法复制和盗用行为,保护文本著作权人或拥有人的权益。除此之外,文本水印技术还可用于在文本中隐藏和传递秘密信息、文本内容的认证、文本信息的追踪等方面。
文本水印目前主要有两类方法——基于文本格式的文本水印和基于自然语言的文本水印。基于文本格式的水印技术利用轻微改变文本格式不易被察觉的特点来嵌入水印信息,如改变行间距、字间距、字符大小等等。这类基于文本格式的水印技术构造简单,易于实现,但对文本进行格式变换就有可能使嵌入的水印遭到破坏,鲁棒性不强。基于自然语言的文本水印技术利用文本内容的语法语义进行编码来嵌入水印信息,目前实现的较多的是通过同义词替换和句法变换对水印信息进行编码。与基于文本格式的水印相比,自然语言文本水印具有更好的隐蔽性和鲁棒性,格式变换不会对水印产生影响。但由于中文语言的复杂性,同义词替换和句法变换有可能会产生歧义或改变语义,同时它也不适用于文本内容不宜改变的情形。
发明内容
本发明目的在于克服以上现有技术之不足,提供一种具有良好的隐蔽性和鲁棒性的基于主谓语编码的文本水印嵌入以及提取方法,具体有以下技术方案实现:
所述基于主谓语编码的文本水印嵌入方法,包括
1)将水印信息的每个字符用Unicode编码表示,形成一个Unicode码串。
2)检测出待嵌入文本中语句的主谓语,存放于一集合中。
3)根据检测出的主谓语数量,将Unicode码串分成若干段,每一个主谓语用其中的一段来编码表示。考虑到改变文本中语句的顺序可能会使水印信息不能正确提取,对每一个主谓语对应的Unicode码段给定一个编号,用于提取水印时根据编号拼接Unicode码串。
4)依次存储每个主谓语、该主谓语对应的Unicode码段以及该主谓对应的编号,形成一个码本,完成编码,实现水印的嵌入。
上述Unicode编码采用UTF-16格式,每个字符为4位十六进制数,形成一个十六进制的Unicode码串。
所述步骤2)中检测出待嵌入文本中的主谓语包括如下步骤:
A)将提交待嵌入水印的文本转换为字符串的形式;
B)将待嵌入水印的文本的字符串提交至语言技术平台LTP进行依存句法分析,得到一个包含文本中句子成分依存关系的XML格式的字符串;
C)将得到的XML格式的字符串转换为XML文件,对XML文件进行DOM解析,根据XML文件中句子成分关系属性的核心关系和主谓关系之间的联系,循环遍历文件,查找出每句的主谓语。
所述基于主谓语编码的文本水印嵌入方法的进一步设计在于,所述码本中每一行的主谓语、Unicode码段、编号之间分别用空格隔开。
根据所述基于主谓语编码的文本水印嵌入方法,提出一种基于主谓语编码的文本水印的提取方法,包括找出被检测的文本中的主谓语,对照嵌入水印时形成的所述码本,从码本中取出各主谓语对应的Unicode码段、编号,将Unicode码段按对应的编号的顺序拼接起来,得到代表水印信息的Unicode码串,再转换成对应的字符,形成嵌入的水印信息。
所述基于主谓语编码的文本水印的提取方法的进一步设计在于,所述取出被检测文本中各主谓语对应的Unicode码段及其编号的步骤包括:将找出的被检测文本中的每个主谓语与码本中的各个主谓语逐一进行比较,若两者一致,则从码本中取出该主谓语对应的Unicode码段、编号。
本发明的优点如下:
本发明提出一种新的文本水印嵌入及提取方法,利用文本中语句的主谓语对水印信息进行编码来嵌入水印。该方法对文本格式与内容不做任何改变,对原文本不会产生丝毫影响,水印的嵌入没有任何痕迹,不会被察觉和发现,具有很好的隐蔽性。对文本进行格式变换(包括改变行间距、字间距,改变字符大小、字体、颜色等等),调整文本段落、改变句子顺序都不会影响水印的正确提取,具有良好的鲁棒性。同时算法构造简单,易于实现。
具体实施方式
下面对本发明方案进行详细说明。
本实施例提供的基于主谓语编码的文本水印嵌入方法,包括如下步骤:1)将水印信息的每个字符用UTF-16格式的Unicode编码表示,每个字符为4位十六进制数,形成一个十六进制的Unicode码串。2)检测出待嵌入文本中的主谓语,存放于一集合中。3)根据检测出的主谓语数量,将Unicode码串分成若干段,每一个主谓语用其中的一段来编码表示,对每一个主谓语对应的Unicode码段给定一个编号,用于提取水印时根据编号拼接Unicode码串。4)依次存储每个主谓语、与该主谓语对应的Unicode码段、及其编号,形成一个码本,完成编码,实现水印的嵌入。其中,码本中每一行的主谓语、Unicode码段、编号之间分别用空格隔开。
进一步地,步骤2)中检测出待嵌入文本中的主谓语包括如下步骤:A)将提交待嵌入水印的文本转换为字符串的形式。B)将待嵌入水印的文本的字符串提交至语言技术平台LTP进行依存句法分析,得到一个包含文本中句子成分依存关系的XML格式的字符串。C)将得到的XML格式的字符串转换为XML文件,对XML文件进行DOM解析,根据XML文件中句子成分关系属性的核心关系和主谓关系之间的联系,循环遍历文件,查找出每句的主谓语。
上述提及的语言技术平台(LanguageTechnologyPlatform,LTP)是哈尔滨工业大学社会计算与信息检索研究中心历时十年研制的一整套开放式在线中文自然语言处理系统,包括词法分析(分词、词性标注和命名实体识别)、句法分析(依存句法分析)、语义分析(词义消歧和语义角色标注)三方面六项语言处理功能。该平台对外开放,使用方便。系统提供一个应用程序接口(API),用户根据自己的应用需求,设置API参数,构造HTTP请求,将文本内容提交给系统,即可在线获得分析结果。此处主要用到LTP的依存句法分析功能,将待分析的文本提交给平台,经平台处理得到文本中语句各成分之间的依存关系。根据依存关系,经过进一步处理得到语句的主谓语。其基本过程如下:
将待分析的文本内容转换为字符串,设置API参数和调用方式,将包含文本内容的字符串提交给LTP进行依存句法分析。获取LTP的处理结果,得到一个包含文本中句子成分依存关系的XML格式的文件。该文件包含了para(段落)、sent(句子)、word(分词)等节点。每个分词节点(word)有以下属性:id,为分词在句子中的序号;cont,为分词内容;parent,为依存句法分析的父节点的id号;relate,为相对应的关系。为找出文本中的所有主谓语,循环遍历文本中的每一段,每一句,每一个分词。当循环遍历到word节点时,如果属性relate="HED"(HED表示核心关系),则word节点的cont值即为本句谓语,然后查找本句是否存在这样的word节点,节点的relate属性值为SBV(SBV表示主谓关系),并且其parent属性值与谓语节点的id号相等。如果存在,该word节点的cont值就是本句的主语。将本句的主语和谓语提取出来,存放到一个集合中。
以下给出实现水印嵌入过程的具体功能代码及注释:
按照LTP系统应用程序接口API的要求,将需要提交分析的文本转换为字符串的形式,可以用C#语言的System.IO.File.ReadAllText(stringpath,Encoding.Default)函数来实现,相应的程序代码为:
Stringtext=System.IO.File.ReadAllText(path,Encoding.Default);
其中,path为待分析的文本文件的路径,text即为包含文本内容的字符串。
设置API参数,包括访问LTPWeb服务的地址urlbase、使用API的钥匙api_key(用户注册时获得)、分析模式pattern(选择dp,依存句法分析)、结果格式类型format(选择XML格式)、HTTP请求方式(选择GET方式)等,将包含文本内容的字符串(text)提交给LTP平台进行依存句法分析。实现这一过程的核心代码如下:
stringurlbase="http://api.ltp-cloud.com/analysis/";
stringapi_key="k2r3q7tqGgWp5zBZRSnEHvNKfTRSFhjMtnHQ0QeP";
stringpattern="dp";
stringformat="xml";
stringstrParam=("api_key="+api_key+"&text="+text.ToString()
+"&pattern="+pattern+"&format="+format);
Encodingencoding=Encoding.GetEncoding("utf-8");
HttpWebRequestreq=
WebRequest.Create(urlbase+strParam)asHttpWebRequest;
req.Method="GET";
获取LTP的处理结果,得到一个包含文本中句子成分依存关系的XML格式的字符串。这一过程可以用C#语言的StreamReader类来实现,相应的程序代码为:
HttpWebResponsewebResponse=req.GetResponse()asHttpWebResponse;
StreamReaderstreamReader=
newStreamReader(webResponse.GetResponseStream(),encoding);
Stringresult=streamReader.ReadToEnd();
result中存放的即为处理后的结果。
将得到的XML格式的字符串转换为XML文件,对XML文件进行DOM解析,根据依存句法分析结果中每句的relate属性的HED(核心关系)和SBV(主谓关系)之间的联系,循环遍历每一段,每一句,每一个分词,查找出每句的主谓语。实现这一过程的核心代码如下:
XmlDocumentdoc=newXmlDocument();//转换为XML文件
doc.LoadXml(result);
XmlElementroot=doc.DocumentElement;//循环遍历
XmlNodeListlist1,list2,list3;
XmlNodelist4;
list1=root.SelectNodes("//para");
foreach(XmlNodenode1inlist1){//循环遍历para节点
list2=node1.ChildNodes;
foreach(XmlNodenode2inlist2){//循环遍历sent节点
list3=node2.ChildNodes;
foreach(XmlNodenode3inlist3){//循环遍历word节点
if(node3.Attributes["relate"].InnerText=="HED"){//判断谓语
list4=node3;
foreach(XmlNodenode4inlist3){
if(node4.Attributes["parent"].InnerText==list4.Attributes["id"].InnerText&&node4.Attributes["relate"].InnerText=="SBV")//判断主语hs.Add(node4.Attributes["cont"].InnerText+list4.Attributes["cont"].InnerText+"");
}
}
}
}
}
List<string>sbv=newList<string>();
sbv.AddRange(hs);
集合sbv中存放的即为文本中的主谓语。
将需要嵌入的水印信息根据UTF-16编码,转换成一个Unicode码串。相应的实现代码为:
byte[]bts=Encoding.Unicode.GetBytes(info);
for(inti=0;i<bts.Length;i+=2)
uc+=bts[i+1].ToString("x").PadLeft(2,'0')+bts[i].ToString("x").PadLeft(2,'0');
其中,info中存放的为水印信息,uc中即为生成的Unicode码串。
用主谓语集合中的主谓语对上述Unicode码串进行编码。依次取出集合中的每一个主谓语,为其分配一段Unicode码,并给定一个编号,主谓语、Unicode码段、编号之间分别用空格隔开,形成码本。实现这一过程的核心代码如下。
确定为每个主谓语分配的Unicode码的位数的代码:
strU_size=uc.length();//strU_size为Unicode码串的位数
sbv_size=sbv.Count;//sbv_size为主谓语的个数
count_size=strU_size/sbv_size;//count_size是为主谓语分配Unicode码的位数
为每个主谓语分配一段Unicode码的代码:
for(intx=0;x<sbv_size;x++){
if(x==sbv_size-1){//为最后一个主谓语分配Unicode码(位数不同,单独处理)
code_list.Add(sbv[x]+""+uc.ToString().Substring(x*count_size)+""+(x+1));
}else{//为前面的主谓语分配Unicode码(平均分配,位数相同)
if(x*count_size-1>0){
code_list.Add(sbv[x]+""+uc.ToString().Substring(x*count_size,count_size)+""+(x+1));
}else{
code_list.Add(sbv[x]+""+uc.ToString().Substring(0,x*count_size+count_size)+""+(x+1));
}
}
}
集合code_list存放的即为码本内容,将其写入一个txt文件,便得到嵌入水印的码本文件。
根据上述基于主谓语编码的文本水印嵌入方法,提出一种基于主谓语编码的文本水印的提取方法,其具体实施方式为:
当需要提取水印时,将被检测的文本提交LTP平台进行依存句法分析,对分析结果进行进一步处理得到文本中的主谓语,存放于一集合中。实现这一过程的代码与前面嵌入水印时相同。
打开嵌入水印时形成的码本文件,对照码本,对上述集合中的每一个主谓语进行译码。即依次将集合中的每一个主谓语与码本中的各个主谓语逐一进行比较,若两者一致,则将该主谓语对应的Unicode码段及其编号取出。将获取的各Unicode码段按其编号顺序拼接起来,得到代表水印信息的Unicode码串。
以下给出实现上述过程的主要操作的代码及注释:
读取码本的每一行,将其放入一个数组。实现代码为:
string[]lines=File.ReadAllLines(path);
其中,path为码本文件的路径,lines为包含码本每一行内容的数组。
根据空格,将每一行的主谓语分割出来,与前述集合中存放的被检测文本中的主谓语逐一进行比较,如有一致者,取出该行的Unicode码段及其编号,放入一个集合。实现代码为:
for(inti=0;i<sbv.Count;i++){
for(intj=0;j<lines.Length;j++){
string[]lgs=lines[j].ToString().Split(newChar[]{''},2);
if(sbv[i]==lgs[0])
st.Add(lgs[1]);}
}
st即为存放Unicode码段及其编号的集合。
根据空格,将各Unicode码段与其编号分割开来,按照编号顺序将各码段拼接起来,得到代表水印信息的Unicode码串。实现代码为:
for(intx=0;x<st.Count;x++){
for(inty=0;y<st.Count;y++){
string[]lgs=st[y].ToString().Split(newChar[]{''},2);
if(Convert.ToInt32(lgs[1])==(x+1))
drawUc.Append(lgs[0]);
}
}
drawUc中即为代表水印信息的Unicode码串。
根据嵌入水印时使用的UTF-16编码规则,将上述Unicode码串转换为对应的字符,便得到嵌入的水印信息。实现这一过程的核心代码如下:
MatchCollectionmc=Regex.Matches(str,"([\w]{2})([\w]{2})",
RegexOptions.Compiled|RegexOptions.IgnoreCase);
byte[]bts=newbyte[2];
foreach(Matchminmc){
bts[0]=(byte)int.Parse(m.Groups[2].Value,NumberStyles.HexNumber);
bts[1]=(byte)int.Parse(m.Groups[1].Value,NumberStyles.HexNumber);
toStr+=Encoding.Unicode.GetString(bts);
}
toStr中所含即为提取出的水印信息。
机译: 预测模式选择方法,一种基于主边的方向性来减少预测模式候选的数量的装置,一种使用该方法的运动图像压缩方法,一种包括该装置的运动图像编码器以及一种编码器执行该方法的程序
机译: 一种基于两种计算机硬件处理特性的文本搜索方法:间接内存寻址和ASCII编码
机译: 一种基于两种计算机硬件处理属性的文本搜索方法:间接内存寻址和ASCII编码