文本挖掘之文本推荐(子集合生成)

刘 勇   Email:[email protected]

简介

  在研究文本推荐算法时,需要挖掘关键字之间的规则,其中比较重要的一步是构建关键字的集合,即需要求取一个集合的所有子集。因此本文根据需求,采用3种方式实现该算法,以期对后续算法研究提供帮助。

  本文下面从二叉树递归、位图和集合3个角度,对该算法进行研究与实现。

二叉树递归

  为简要描述,采用数据集为:A= {1,2,3}。二叉树递归如下图-1所示。

图-1 二叉树递归过程

  对图-1采用二叉树递归解释为:集合中每个元素有2中状态,属于某个集合,或者不属于该集合,因此求取子集的过程则为对每个元素进行取舍的过程。如图-1所示,根节点为初始状态,叶子节点为终结状态,除第一层(根节点)为,后续每一层即为对每个元素展开的一次取舍操作。整个过程采用二叉树的先序遍历。

 1 import java.util.List;
 2 import java.util.ArrayList;
 3
 4 public class SubSet {
 5     private List<List<String>> listList = null;
 6
 7     public SubSet(List<String> list)
 8     {
 9         listList = new ArrayList<List<String>>();
10         int len = list.size();
11         List<String> dst = new ArrayList<String>();
12         for (int i = 0; i < len; i++) {
13             generate(list, 0, i, dst);
14         }
15     }
16
17
18     public void generate(List<String> list, int index, int number, List<String> dst) {
19         if (number == -1) {
20             List<String> strList = new ArrayList<String>();
21             for (String s : dst)
22                 strList.add(s);
23             listList.add(strList);
24             return;
25         }
26
27         if (index == list.size()) {
28             return;
29         }
30         String element = list.get(index);
31         dst.add(element);
32         generate(list, index+1, number-1, dst);
33         dst.remove(element);
34         generate(list, index+1, number, dst);
35     }
36
37
38     public void printList()
39     {
40         for (List<String> list : listList) {
41             for (String s : list) {
42                 System.out.print(s + "\t");
43             }
44             System.out.println();
45         }
46     }
47 }

位图

  为描述方便,采用数据集为:A= {1,2,3}。对于任意一个元素,属于某个集合或者不属于该集合。前述集合以“1”为存在于集合,若为“0”则不存在于该集合,采用位图映射为:

  {1,2,3}

  {0,0,0}-->{}

  {0,0,1}-->{3}

  {0,1,0}-->{2}

  {0,1,1}-->{2,3}

  {1,0,0}-->{1}

  {1,0,1}-->{1,3}

  {1,1,0}-->{1,2}

  {1,1,1}-->{1,2,3}

import java.util.List;
import java.util.ArrayList;

public class BitSet {
    private List<List<String>> listList= null;

    public BitSet(List<String> list) {
        listList = new ArrayList<List<String>>();
        int len = list.size();
        int mark = 0;
        long end = (1<<len) -1;  // 2^len-1
        for (mark = 0; mark <= end; mark++) {
            List<String> dst = new ArrayList<String>();
            for (int i = 0; i < len ; i++) {
                if ((1<<i & mark) != 0) { // i has one element
                    dst.add((list.get(i)));
                }
            }

            if (dst.size() > 0) {
                listList.add(dst);
            }
        }
    }

    public void printList()
    {
        for (List<String> list : listList) {
            for (String s : list) {
                System.out.print(s + "\t");
            }
            System.out.println();
        }
    }
}

集合

  为描述方便,采用数据集为:A={1,2,3,4},其根据两个上一级目标集合生成下一级的目标集合,其核心解决方案为通过上一层集合的前K-2个元素相同(K为新集合的元素个数),则将上一层集合元素合并生成新的集合,如A31={1,2,3},A32={1,2,4},则生成新的目标集合A41={1,2,3,4},该方案最大的优点是:使得生成的集合中,元素没有重复。

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 import java.util.Set;
  4 import java.util.TreeSet;
  5
  6 public class SetSet {
  7     private List<List<Set<String>>> L = null;
  8
  9     public SetSet(List<String> set) {
 10         List<Set<String>> initSet = createInitSet(set);
 11         L = new ArrayList<List<Set<String>>>();  // contains all the subsets
 12         L.add(initSet);
 13         int k = 2;
 14         while (L.get(k-2).size() > 0) {
 15             List<Set<String>> Ck = aprioriGen(L.get(k-2), k);
 16             L.add(Ck); // add the C(k) and the generate C(k+1)
 17             k += 1;
 18         }
 19     }
 20
 21     /**
 22      * create one list
 23      * @param set : the data set
 24      * @return the list generated
 25      */
 26     public List<Set<String>> createInitSet(List<String> set)
 27     {
 28         List<Set<String>> list = new ArrayList<Set<String>>();
 29         for (String element : set) {
 30             Set<String> e = new TreeSet<String>();
 31             e.add(element);
 32             if (!list.contains(e))
 33                 list.add(e);
 34         }
 35         return list;
 36     }
 37
 38     /**
 39      * generate the number of k items
 40      * @param list : the source list
 41      * @param k : the numbers
 42      * @return the list with set
 43      */
 44     public List<Set<String>> aprioriGen(List<Set<String>> list, int k)
 45     {
 46         List<Set<String>> retList = new ArrayList<Set<String>>();
 47         int size = list.size();
 48         for (int i = 0; i < size; i++) {
 49             Set<String> set1 = list.get(i);
 50             for (int j = i+1; j < size; j++) {
 51                 Set<String> set2 = list.get(j);
 52                 if (isEquals(getSubclass(list.get(i), k-2), getSubclass(list.get(j), k-2))) { // the 0:k-2 contain the same elements
 53                     retList.add(getUnion(set1, set2));
 54                 }
 55             }
 56         }
 57         return retList;
 58     }
 59
 60     /**
 61      * get the union of two sets
 62      * @param src : the source set
 63      * @param dst : destination set
 64      * @return one set
 65      */
 66     public Set<String> getUnion(Set<String> src, Set<String> dst)
 67     {
 68         Set<String> set = new TreeSet<String>();
 69         for (String element : src)
 70             set.add(element);
 71
 72         for (String item : dst)
 73             if (!set.contains(item))
 74                 set.add(item);
 75
 76         return set;
 77     }
 78
 79     /**
 80      * get the top K elements of the set
 81      * @param src : the source set
 82      * @param k : the top K
 83      * @return the top K elements
 84      */
 85     public Set<String> getSubclass(Set<String> src, int k)
 86     {
 87         Set<String> set = new TreeSet<String>();
 88         int index = 0;
 89         for (String s : src) {
 90             if (index < k)
 91                 set.add(s);
 92             else
 93                 break;
 94
 95             index++;
 96         }
 97         return set;
 98     }
 99
100     /**
101      * assert the equals of tow sets
102      * @param src : the source set
103      * @param dst : the destination set
104      * @return if src == dst, return true else return false
105      */
106     public boolean isEquals(Set<String> src, Set<String> dst)
107     {
108         boolean ret = false;
109         if (src.size() == dst.size()) {
110             if (src.size() == 0)
111                 ret = true;
112             else if (src.containsAll(dst))
113                 ret = true;
114         }
115         return ret;
116     }
117 }

  由于本文在研究文本推荐时,参考《机器学习实战》,故此先入为主,采用了第三种方法。但是,本文作者并不认为第三种方法效率较高,在大规模数据时,作者倾向于先用方案二(位图运算)。

参考文献

  [1] Peter Harrington, Machine Learning in action, 人民邮电出版社, 2015.4.



  作者:志青云集
  出处:http://www.cnblogs.com/lyssym
  如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
  如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
  如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。



文本挖掘之文本推荐(子集合生成)

时间: 2024-10-15 14:16:30

文本挖掘之文本推荐(子集合生成)的相关文章

文本挖掘之文本聚类(OPTICS)

刘 勇  Email:[email protected] 简介 鉴于DBSCAN算法对输入参数,领域半径E和阈值M比较敏感,在参数调优时比较麻烦,因此本文对另一种基于密度的聚类算法OPTICS(Ordering Points To Identify the Clustering Structure)展开研究,其为DBSCAN的改进算法,与DBSCAN相比,该算法对输入参数不敏感.OPTICS算法不显示地生成数据聚类,其只是对数据对象集合中的对象进行排序,获取一个有序的对象列表,其中包含了足够的信

拆分集合为相等的子集合(第1届第1题)

题目要求 问题描述:将1到N的连续整数组成的集合划分为两个子集合,且保证每个集合的数字和相等.例如,对于N=4,对应的集合{1,2,3,4},能被划分为{1,4}.{2,3}两个集合,使得1+4=2+3,且划分方案只有此一种.编程实现给定任一正整数N(1<=N<=39),输出其符合题意的划分方案数. 样例输入1:3 样例输出1:1    (可划分为{1,2}.{3}) 样例输入2:4 样例输出2:1    (可划分为{1,3}.{2,4}) 样例输入3:7 样例输出3:4    (可划分为{1

文本挖掘之文本聚类(MapReduce)

刘 勇  Email:[email protected] 简介 针对大数量的文本数据,采用单线程处理时,一方面消耗较长处理时间,另一方面对大量数据的I/O操作也会消耗较长处理时间,同时对内存空间的消耗也是很大,因此,本文引入MapReduce计算模型,以分布式方式处理文本数据,以期提高数据处理速率.本文结合Kmeans和DBSCAN算法,对上述算法进行改进,其中借鉴Kmeans聚类方法(类别个数的确定性)以及DBSCAN聚类方法(基于密度),并在数据处理过程中引入多个Reducer对数据进行归并

文本挖掘之文本聚类(借力打力)

刘勇    Email:[email protected] 简介 在文本相似度判定中,作者将该算法用于文本聚类中,其核心思想通过比较两个文本向量中元素的相似度,即向量中所含的元素相似个数越多,则两个向量越相似,继而上述文本越相似.作者在短文本相似判定中采用了余弦相似度该算法来实现,本文借鉴数学集合取交集,借用现有组件来实现上述算法功能,继而减少工作量,也具备便捷性,也能取得较好的效果. 数学集合 该方法的思想为:先将文本数据采用中文切分,将其切分为词汇(词组.短语.词汇的统称,本文不做细粒度划分

文本挖掘之文本聚类(DBSCAN)

刘勇   Email:[email protected] 简介 鉴于基于划分的文本聚类方法只能识别球形的聚类,因此本文对基于密度的文本聚类算法展开研究.DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种典型的基于密度的聚类方法,可以找出形状不规则的聚类,而且聚类时无需事先知道聚类的个数.  基本概念 DBSCAN算法中有两个核心参数:Eps和MinPts(文献与程序中经常使用).前者定义为邻域半径,后者定义

LeetCode 90. Subsets II (子集合之二)

Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example,If nums = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 题目标签:Arr

蓝桥杯——分治法之子集合的个数

{1,2,3}子集合的个数,有{1},{2},{3},{1,2},{2,3},{1,3},{1,2,3},求n个元素组成的集合,m个元素组成的子集合的个数. 如上例,3个元素由其中2个组成的子集合有3个. public class Main{ public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(cal(3, 2)); } static int cal(int n,

0-1背包问题与子集合加总问题的近似算法

最近没有怎么更新博客,因为一直比较忙.最近发现所里在做的一个项目中,可以抽出一部分内容和0-1背包问题.子集合加总问题非常相似(虽然表面上不容易看出相似点),所以看了一些这方面的资料和论文,这里主要对问题特点和算法思想做一些整理.这类问题其实很有意思,做数学和做计算机的人都会研究,而且我这里将要提到的论文都是做计算机的人所写的. 问题简述0-1 Knapsack Problem (0-1背包问题,下面简称KP)和Subset Sum Problem (子集合加总问题,下面简称SSP)是经典的NP

如何去掉子集合功能中的按钮?

解决方案:1.找到子集合字段2.打开字段详细信息,在辅助配置里面进行配置 加入JEPaaS技术交流群,了解更多** 原文地址:https://blog.51cto.com/13797782/2440352