java大作业 KShinglingAlgorithm

wiki上关于KShingling Algorithm(w-shingling)的说明:

http://en.wikipedia.org/wiki/W-shingling

摘要:

In natural language processing a w-shingling is a set of unique "shingles"—contiguous subsequences of tokens in a document—that can be used to gauge the similarity of two documents. The w denotes the number of tokens in each shingle in the set.

The document, "a rose is a rose is a rose" can be tokenized as follows:

(a,rose,is,a,rose,is,a,rose)

The set of all contiguous sequences of 4 tokens (N-grams, here: 4-grams) is

{ (a,rose,is,a), (rose,is,a,rose), (is,a,rose,is), (a,rose,is,a), (rose,is,a,rose) } = { (a,rose,is,a), (rose,is,a,rose), (is,a,rose,is) }

我理解的此算法,是把每段文本都像上述分解后,统计两段文本的合集b,再统计交集a,用a/b得到相似度。

写得有些复杂:

  1 package bigproject2;
  2
  3 import javax.swing.JOptionPane;
  4
  5 public class union {
  6     //求子集
  7     public String[] ziji(String str)
  8     {
  9         char[] ch=str.toCharArray();
 10         int c=0;
 11         for(int i=0;i<ch.length;i++)
 12         {
 13             if(ch[i]==‘ ‘)
 14                 c++;
 15         }
 16         //建立单词数组
 17         String[] strt=new String[c+1];
 18         for(int i=0;i<c+1;i++)
 19             strt[i]="";
 20         int h=0;
 21         for(int i=0;i<c+1;i++)
 22         {
 23             for(int j=h;j<ch.length;j++)
 24             {
 25                 if(ch[j]==‘ ‘)
 26                 {
 27                     h=j+1;
 28                     break;
 29                 }
 30                 else strt[i]+=ch[j];
 31             }
 32         }
 33         return strt;
 34     }
 35     //按k分,并去掉重复子集。
 36     public String[] cut(String[] str,int k) throws MyException{
 37         if(str.length<k)
 38                 throw new MyException("单词数少于"+k+",无法进行计算!");
 39         String[] t=new String[str.length-k+1];
 40         for(int i=0;i<str.length-k+1;i++)
 41             t[i]="";
 42         int h=0,m=0;
 43         for(;h<str.length-k+1;h++)
 44         {
 45             for(int i=m;i<m+k;i++)
 46                 t[h]+=str[i];
 47             m++;
 48         }
 49         //去掉重复部分
 50         int merge=0;
 51         for(int i=0;i<t.length-1;i++)
 52         {
 53             if(t[i].equals("")) break;
 54             for(int j=i+1;j<t.length;j++)
 55             {
 56                 if(t[i].equals(t[j]))
 57                 {
 58                     merge++;
 59                     int y=j;
 60                     for(;y<t.length-1;y++)
 61                     {
 62                         t[y]=t[y+1];
 63                     }
 64                     t[y]="";
 65                 }
 66             }
 67         }
 68         String[] fin=new String[t.length-merge];
 69         for(int i=0;i<t.length-merge;i++)
 70             fin[i]=t[i];
 71         return fin;
 72     }
 73     public class MyException extends Exception{
 74         public MyException(String str){
 75             JOptionPane.showMessageDialog(null, str,"警告", JOptionPane.INFORMATION_MESSAGE);
 76         }
 77     }
 78     //求两字符串数组合集个数。
 79     public int heji(String[] a,String[] b){
 80         int count=a.length+b.length;
 81         for(int i=0;i<a.length;i++)
 82         {
 83             for(int j=0;j<b.length;j++)
 84             {
 85                 if(a[i].equals(b[j]))
 86                     count--;
 87             }
 88         }
 89         return count;
 90     }
 91     //求两字符串数组交集个数。
 92     public int jiaoji(String[] a,String[] b){
 93         int count=0;
 94         for(int i=0;i<a.length;i++)
 95         {
 96             for(int j=0;j<b.length;j++)
 97             {
 98                 if(a[i].equals(b[j]))
 99                     count++;
100             }
101         }
102         return count;
103     }
104
105 }
 1 package bigproject2;
 2
 3
 4 public class KShinglingAlgorithm extends union{
 5     private String text1,text2;
 6     public String getText1()
 7     {
 8         return text1;
 9     }
10     public String getText2()
11     {
12         return text2;
13     }
14     public void setText1(String text1)
15     {
16         this.text1=text1;
17     }
18     public void setText2(String text2)
19     {
20         this.text2=text2;
21     }
22
23     public float getSimilarity(int k)
24     {
25        union a=new union();
26        String[] t1=a.ziji(this.text1);
27        String[] t2=a.ziji(this.text2);
28        String[] t1t,t2t;
29        try{
30            t1t=a.cut(t1, k);
31            t2t=a.cut(t2, k);
32
33        }catch(MyException e){
34                return -1;
35        }
36        int he=a.heji(t1t, t2t);
37        int jiao=a.jiaoji(t1t, t2t);
38        return (float)jiao/he;
39     }
40
41 }

面板设计部分:

  1 package bigproject2;
  2 import java.awt.*;
  3 import java.awt.event.*;
  4 import java.io.BufferedReader;
  5 import java.io.File;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileReader;
  8 import java.io.IOException;
  9 import java.io.InputStreamReader;
 10
 11 import javax.swing.*;
 12 import javax.swing.event.*;
 13 import javax.swing.filechooser.FileNameExtensionFilter;
 14
 15 public class Outlook extends JFrame{
 16     JFrame frm=new JFrame("相似度计算器");
 17     JPanel areabottom=new JPanel();
 18     JPanel areatop=new JPanel();
 19     JPanel areamiddle=new JPanel();
 20     static JTextArea tl=new JTextArea();
 21     static JTextArea tr=new JTextArea();
 22     JScrollPane left=new JScrollPane(tl,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
 23             JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 24     JScrollPane right=new JScrollPane(tr,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
 25             JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 26     JSplitPane sp=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,right);
 27     static JButton toBig=new JButton("全部大写");
 28     static JButton delbd=new JButton("去掉标点");
 29     static JButton count=new JButton("计算相似度");
 30     JLabel space=new JLabel("                                               ");
 31     JLabel t1=new JLabel("Text1");
 32     JLabel t2=new JLabel("Text2");
 33
 34     JMenuBar mb=new JMenuBar();
 35     JMenu open=new JMenu("打开");
 36     JMenuItem opent1=new JMenuItem("打开到Text1");
 37     JMenuItem opent2=new JMenuItem("打开到Text2");
 38
 39     private String str="";
 40     public Outlook()
 41     {
 42         judge();
 43
 44         frm.setVisible(true);
 45         frm.setBounds(50, 50, 500, 400);
 46         frm.setLayout(new BorderLayout(5,5));
 47
 48         frm.add("North",areatop);
 49         frm.add("Center",areamiddle);
 50         frm.add("South",areabottom);
 51
 52         areatop.add(mb);
 53         mb.add(open);
 54         open.add(opent1);
 55         open.add(opent2);
 56         open.setPreferredSize(new Dimension(40,18));
 57         mb.setBackground(frm.getBackground());
 58         areatop.setLayout(new FlowLayout(FlowLayout.LEFT));
 59         areamiddle.setLayout(new FlowLayout(FlowLayout.LEFT));
 60
 61         areamiddle.add(t1);
 62         t1.setPreferredSize(new Dimension(frm.getWidth()/2-20,10));
 63         areamiddle.add(t2);
 64         t2.setPreferredSize(new Dimension(50,10));
 65         areamiddle.add(left);
 66         left.setPreferredSize(new Dimension(frm.getWidth()/2-20,frm.getHeight()/2));
 67         areamiddle.add(right);
 68         right.setPreferredSize(new Dimension(frm.getWidth()/2-20,frm.getHeight()/2));
 69         tl.setLineWrap(true);
 70         tr.setLineWrap(true);
 71
 72         areabottom.add(toBig);
 73         areabottom.add(delbd);
 74         areabottom.add(space);
 75         areabottom.add(count);
 76
 77         opent1.addActionListener(new ActionListener(){
 78             public void actionPerformed(ActionEvent e) {
 79                 try {
 80                     openfile();
 81                     tl.setText(str);
 82                 } catch (IOException e1) {
 83                     e1.printStackTrace();
 84                 }
 85                 judge();
 86             }
 87         });
 88         opent2.addActionListener(new ActionListener(){
 89             public void actionPerformed(ActionEvent e) {
 90                 try {
 91                     openfile();
 92                     tr.setText(str);
 93                 } catch (IOException e1) {
 94                     e1.printStackTrace();
 95                 }
 96                 judge();
 97             }
 98         });
 99         toBig.addActionListener(new ActionListener(){
100             public void actionPerformed(ActionEvent e){
101                 tl.setText(tobig(tl.getText()));
102                 tr.setText(tobig(tr.getText()));
103             }
104         });
105
106         delbd.addActionListener(new ActionListener(){
107             public void actionPerformed(ActionEvent e){
108                 tl.setText(del(tl.getText()));
109                 tr.setText(del(tr.getText()));
110                 judge();
111             }
112
113         });
114         count.addActionListener(new ActionListener(){
115             public void actionPerformed(ActionEvent e){
116                 KShinglingAlgorithm a=new KShinglingAlgorithm();
117                 a.setText1(tl.getText());
118                 a.setText2(tr.getText());
119                 float b=a.getSimilarity(4);
120                 if(b!=-1)
121                     JOptionPane.showMessageDialog(null, Float.toString(b),"相似度", JOptionPane.INFORMATION_MESSAGE);
122             }
123         });
124         tr.addKeyListener(new KeyAdapter(){
125             public void keyTyped(KeyEvent e){
126                 judge();
127             }
128         });
129         tl.addKeyListener(new KeyAdapter(){
130             public void keyTyped(KeyEvent e){
131                 judge();
132             }
133         });
134     }
135     public void judge(){
136         if(tl.getText().length()!=0||tr.getText().length()!=0) {
137             toBig.setEnabled(true);
138             delbd.setEnabled(true);
139             count.setEnabled(true);
140         }
141         else{
142             toBig.setEnabled(false);
143             delbd.setEnabled(false);
144             count.setEnabled(false);
145         }
146     }
147     public void openfile() throws IOException{
148         str="";
149         JFileChooser choose=new JFileChooser();
150         int result = choose.showOpenDialog(this);
151         File file = null; //注意初始化
152         //加过滤器
153         if (result == JFileChooser.APPROVE_OPTION) {
154             file = choose.getSelectedFile();
155             }
156         else{
157             return; //使点取消后不会抛出异常
158         }
159         FileReader fr=new FileReader(file);
160         BufferedReader br=new BufferedReader(fr);
161         char c[]=new char[512];
162         String strline="";
163         while(br.ready()){
164             strline=br.readLine();
165             str+=strline;
166         };
167         br.close();
168         fr.close();
169     }
170     public String tobig(String str){
171         String temp="";
172         for(int i=0;i<str.length();i++)
173         {
174             if(str.charAt(i)>=‘a‘&&str.charAt(i)<=‘z‘)
175             {
176                 char t=str.charAt(i);
177                 t=(char)(str.charAt(i)-32);
178                 temp+=t;
179             }
180             else temp+=str.charAt(i);
181         }
182         return temp;
183     }
184
185     public String del(String str){
186         String temp="";
187         for(int i=0;i<str.length();i++)
188         {
189             char t=str.charAt(i);
190             if(t>=‘!‘&&t<=‘/‘||t>=58&&t<=64||t>=91&&t<=96||t>=123&&t<=126);
191             else temp+=t;
192         }
193         return temp;
194     }
195     public static void main(String[] args){
196         new Outlook();
197
198
199     }
200 }

Outlook

时间: 2024-11-08 17:32:41

java大作业 KShinglingAlgorithm的相关文章

java大作业之拼图游戏

这个拼图游戏是帮同学做的,还是挺不错的,实现功能包括:自动选取图片,自动任意切割图片,且保证生成的一定有解,还有倒计时功能. 还写了那个迪杰斯特拉演示的,过两天再发上来,毕竟要考试了(预习了...) 先说下如何保证有解,两种方法:1,先切割然后自己后台让空格自己随机移动. 2,生成全排列,然后判断是否有解: 一个N*M数码是否有解存在以下结论: 1. 如果M为奇数,那么上下移动,左右移动都不会改变序列的逆序值的奇偶性,所以如果begin个end两个状态的逆序值奇偶性一样就有解! 2. 如果M为偶

《Java语言程序设计》大作业报告 九宫格游戏

    <Java语言程序设计>大作业报告     中国石油大学(北京)2015 - 2016 学年第二学期     班级:_____计算机14-1_______ 姓名:_____  许 恺_________________ 学号:______2014011329___________     题意分析 程序首先需要九个可以移动的格子,大小相等,有字符串标示,其次要可以相应鼠标和键盘方向键的控制,可以自由移动,并且与此同时记录步数,最后在满足条件时弹出对话框并显示步数以及是否打破记录,关于打破

并行计算大作业之多边形相交(OpenMP、MPI、Java、Windows)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 吐槽: 话说,相当郁闷,2015年,第一次打开博客,准备总结一下这一年.. 结果博客被封了= =! 今天,终于解封了,换了密码,换了密保.... 但是,写回顾的激情有点退散了.. 明后两天要上课,明天还要验收一个综合设计大作业,再后两天要考试,再后两天继续上课,

编译原理大作业(用java编写小型GCC 编译器)

以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较清晰的认识 编译器的工作原理 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种编程语言的可执行程序. 现代软件对于编译器的需求远甚从前, 究其原因很简单: 作为中间层, 编译器是构建更高层抽象的基础设施. 编译器意欲将人类可阅读的高阶代码, 翻译为机器能运行的低阶代码. 现代编译器的主要工作流程为: 源代码(source code)→ 预处理器(preprocessor)→ 编译

数据库终期大作业报告

需求分析 现代社会,心血管疾病成为了老年人群体中高发的慢性病,一个社区医生往往需要负责多位患者的诊断工作,如果每位患者都要频繁上门问诊,会给医生带来过大的工作压力,也很难顾及到全部患者. 在信息技术高度普及的当下,完全可以利用互联网思维解决问题,制作一个软件用于实现: l  医生随时掌握所负责病人的血压数据,并为病人提供专业诊断意见. l  病人随时上传血压数据,并从医生处获得治疗意见. 概要设计 1.数据库 数据存放在名为dochelper的MySQL数据库中. 数据库包含4张表:doctor

安卓Db天气客户端 大作业开发 记一

前几天总是叫团队开发.但因为是我自己开发的,所以我决定把它叫做大作业开发 今天写一写这几天做的功课. 项目还没开始,还在筹备,准备功课中. 设计准备改一下,调研还是起到了一些作用的,我觉得天气中加入图片创意虽然还不错,但是会混淆功能,还在考虑该不该去掉. 一开始准备开发ios,虚拟机这都要装了,后来发现说在APPstore发布需要花钱..果断放弃投安卓. 安卓需要java编程,还需要做功课,没有object-C接触的感觉好..就接触了一天的object-c就感觉还能有这样的编程..比尼玛蛋的万年

[现代信息检索]搜索引擎大作业

[现代信息检索]搜索引擎大作业 一.题目要求: 新闻搜索:定向采集3-4个体育新闻网站,实现这些网站信息的抽取.索引和检索.网页数目不少于10万条.能按相关度.时间.热度(需要自己定义)等属性进行排序,能实现相似新闻的自动聚类. 二.题目分析 题目分析:我们将任务分解为四个部分:新闻数据的爬取.倒排索引的构建.向量空间模型的实现 和 前端界面. 主要分为四个模块:网络爬虫.构建索引.文档评分.排序显示.其中模块与模块之间又包含一些子模块,包括:网页信息抽取.数据存储.文本分析.tf-idf 权重

第一周大作业1

---恢复内容开始--- 田继平-软件工程-第一次作业 一.自我介绍大家好,我叫田继平,目前就读于东北师范大学信息科学与技术学院计算机技术专业,是一名在读的专硕研一学生,本科就读于北华大学计算机科学技术学院,专业是计算机科学与技术,籍贯吉林省榆树市.二.回答作业问题1.回想一下你曾经对计算机专业的畅想我高考后报考的是计算机科学与技术,当时对计算机技术基本了解为零,当时以为什么东西都会用到计算机,学计算机以后不会找不到工作,刚开学的时候对计算机一窍不通,甚至连优盘拔出来,要单击右键然后弹出都不会,

第三次大作业-作业准备

在第二次大作业结束之后,第三次大作业-白盒测试实践在三周内进行. 由于大家刚进行完一次大作业的辛苦工作,于是本组决定第一周交由大家复习学习之前的黑盒测试实践.搜集资料.自发配置工作环境和工具.进行自己的数学课程复习以及实验室工作.在这段时间内,大家对选择的测试工具进行了一定的了解,在SPOC课程中进行视频学习,学习白盒测试相关的知识点,并在今晚进行了一定的整合. 预计将从明天起正式分工投入到这次作业的工作中! 一.白盒测试实践作业 (1)阶段一:熟悉白盒测试方法. (2)阶段二:熟悉代码复审的过