具体问题:数据挖掘中的Java Data Model设计

由于Java平台在Web和Server端的成熟,我们往往会选择它来作为后端及服务层开发平台,而在面向对象的语言中,我们已经习惯分析对象的属性、行为,并定义一个类。但在数据挖掘中,我们面对的是成百上千可能的不同结构的数据对象,现在面临的问题就是,如何在Java中表述这些数据对象结构?

以一个用户为例,在Java中我们常常这样定义:

public class User {
private String name;
private String gender;
private Integer age;

public void setName (String name) {
    this.name = name;
}

public String getName () {
    return this.name;
}

}
现在,我们来到一个Web数据挖掘场景。两篇从Web上取得的文章,一篇是体育比赛报道,另一篇是新上映电影介绍,对于比赛报道,我们希望有标题、发布时间、比赛时间、比赛地点、球队和比分;对于电影介绍,我们希望有标题、发布时间、上映时间、电影名称、主演名单。

也许我们会想到使用类的继承,首先定义一个文章类:

public class Article {
private String title;
private Date publishDate;
}

然后定义一个比赛报道类:

public class SportsArticle extends Article {
private Date startDate;
private String statium;
private String hostTeam;
private String visitTeam;
private String result;
}

再是一个电影介绍类:

public class MovieArticle extends Article {
private Date showDate;
private String movieName;
private String[] actors;
}

已经满足预定义的所有业务属性了吧?完成!等等……这个设计有没有问题?有!在什么地方会有问题?因为我们开发的是一个数据挖掘应用!

在数据挖掘中,我们面对的数据对象是极其不稳定的。第一,待挖掘的对象可能来自网页、文档或其它格式,并不一定提供了完整的业务属性;第二,数据挖掘中服务的对象是统计模型,根据不同的业务需求和算法,我们需要建立不同的挖掘模型,这就意味着,我们必须不停地修改Java类;这样的设计,是不满足最基本的开放——封闭原则:

一个类的设计,原扩展是开放的,而对修改是封闭的。一个类一旦设计完成,就意味着它可以独立完成工作,而不需要对其修改。
所以,我们必须进一步对这个设计进行优化。突破口在于,寻找出稳定及不稳定的因素。现在让我们来回答以下的问题:

  • 能不能将对象使用更抽象的描述?
  • 哪些是变化的?
    我们的答案:

  • 使用“网页”而不是“文章”来描述对象——如何描述?——定义WebPage类;

  • 待挖掘的变量及值是变化的——如何设计可扩展的结构?——使用键值对容器。
    随后我们设计了一个新的类:

    public class WebPage {
    private String host;
    private String url
    private String title;
    private String content;
    private MetaData data;
    }

    其中MetaData是一个容器类,我们可以使用Map、Set、Collection来完成它的功能:
    public class MetaData {
    private HashMap map;

    public void add (String key, String[] values) {

    map.add(key, values);
    

    }

    public void remove (String key) {

    map.remove(key);
    

    }
    }
    结合JSON序列化实现,已经满足了我们对字段扩展和传输的需求。

© 2018 Silent River All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero