毕业设计(论文)专用纸
示越相近;相似度越接近0则表示内容越来越不匹配。
3.2.2功能模块介绍
本课题设计的基于WEB的相似网页检测主要是进行一个理论的研究,可以搜索与TXT文件相似的网页内容,每一次检测的对象都是放在同一文件夹下,然后对文档进行相似度的检测。另外,本系统对图片、表格等是不进行识别和检测的。
根据实际的需求,基于WEB的相似网页检测可以分成四个功能模块,如图3-1所示。
分词统计模块调用Baidu基于WEB的相似网页检测 查询模块 下载网页解析模块计算文本相似度模块各模块实现的功能如下: (2)分词统计模块
此模块实现文本分词,并对分词进行统计。选择TXT文件所在的文件夹,读取文件内容存为字符串,利用IK分词器将字符串(也就是文本内容)进行分词,并且统计分词出现的次数,最后计算词频。
(3)调用Baidu查询模块
此模块实现调用Baidu对关键词进行网络查询。其中百度的查询代码是
http://www.http://m.njliaohua.com//baidu?wd=[此处为搜索的词语]&tn=monline_4_dg\抽取搜索的网页中的百度链接所用的方法是使用正则表达式http://www.http://m.njliaohua.com//link\\\\?url=\\\\w+(\\\\S+)?\\\
(4)下载网页进行解析模块
此模块对下载的模块进行解析。下载下来的内容为HTML语言,而我们只需要的是里面的文字内容,标签以及标签中的嵌套都不是我们所需。得到的纯文本内容写入文件。
(5)文本相似度计算模块
此模块实现对向量的计算,得出文本相似度。文件通过上述过程都转换成了计算机可
20
图3-1 系统模块图
毕业设计(论文)专用纸
以计算的向量空间,调用计算向量的函数得到一个介于0~1的结果。通过结果可以判定两个文本的相似程度。
3.3系统性能要求
(1)系统设计的合理性
在设计系统时要考虑实际的系统性能和硬件要求,不能忽视所处环境,也不能一味地追求新的设计方法,要保证系统实现的合理性。
(2)系统的简单易用性
本系统侧重于对相似度检测进行一个理论的研究,所以并不需要过于美观、应用的界面,作为用户最终需要的只是两篇文档的相似度比较结果。因此设计时本着“简单易用”的原则,方便用户操作。
(3)系统的可靠性
要比较的两篇文档,可能是数据量很大的文本,就要考虑到系统运行的效率,采取相应的算法加以优化,尽可能的保证系统高性能有效的运行。
21
毕业设计(论文)专用纸
第四章 系统实现
4.1系统运行环境
1、硬件环境:
处理器:Inter Core 或更高 内存:2GB 2、软件环境:
操作系统:Windows XP或者Windows 7 语言开发工具:Eclipse
4.2 核心相关代码分析 4.2.1分词类的介绍
(1)类org.wltea.analyzer.core.IKSegmenter:
说明:这是IK分词器的核心类。它是独立于Lucene的Java分词器实现。当需要在Lucene以外的环境中单独使用IK中文分词组件时,可以使用IKSegmenter。 public IKSegmenter(Reader input,boolean useSmart) 说明:IK主分词器构造函数
参数1:Reader input,字符输入读取
参数2:boolean useSmart ,是否采用智能切分策略。
true使用智能切分,false使用最细粒度切分。
public IKSegmentation(Reader input ,Configuration cfg) 说明:IK主分词器新构造函数 参数1:Reader input,字符输入读取 参数2:Configuration cfg,分词器配置。
用户可以定制自己的Configuration类,来改变词典配置。
public synchronized Lexeme next()throws IOException
22
毕业设计(论文)专用纸
说明:读取分词器切分出的下一个语义单元,如果返回值为null,表示分词器已经结束。 返回值:Lexeme语义单元对象,即相当于Lucene的词元对象Token
(2)类org.wltea.analyzer.core.Lexeme
说明:这是IK分词器的语义单元对象,相当于Lucene中的Token词元对象。由于IK被设计为独立于Lucene的Java分词器实现,因此它需要Lexeme来代表分词的结果。 public int getBeginPosition()
说明:获取语义单元的起始字符在文本中的位置 返回值:int,语义单元相对于文本的绝对起始位置
public int getEndPosition()
说明:获取语义单元的结束字符的下一个位置
返回值:int ,语义单元相对于文本的绝对终止位置的下一个字符位置
public int getLength()
说明:获取语义单元包含字符串的长度
返回值:int,语义单元长度=getEndPosition–getBeginPosition
public String getLexemeText() 说明:获取语义单元包含字符串内容
返回值:String,语义单元的实际内容,即分词的结果
4.2.2核心代码解析
private static Map
Reader input = new StringReader(content); // 智能分词关闭(对分词的精度影响很大)
IKSegmenter iks = new IKSegmenter(input,true); Lexeme lexeme = null;
Map
while ((lexeme = iks.next()) != null) {
if (words.containsKey(lexeme.getLexemeText())) {
23
毕业设计(论文)专用纸
words.put(lexeme.getLexemeText(),words.get(lexeme.getLexemeText()) + 1); } else {
words.put(lexeme.getLexemeText(),1); } }
}catch(IOException e) { e.printStackTrace(); }
return words;
}
该函数主要实现分词功能,参数是读取TXT文件后存入变量中的字符串。利用IK分词器循环对字符串进行分词,得到的分词存入到HashMap中。其中HashMap键值对中key指的是分词,value是该分词在字符串中出现的次数。
private static HashMap
HashMap
}
return tf;
Double size=Double.valueOf(segWordsResult.size()); Set
Integer value=segWordsResult.get(key); tf.put(key,Double.valueOf(value)/size); }
return tf; }
该函数实现词频的统计。参数为通过分词函数得到的(分词,出现次数)键值对的HashMap。而词频的计算方式为该词出现次数/总次数,即是Double.valueOf(value)/size。
public static Map
try{
24