public void findConcepts()
{
findBottomConcept();
findTopConcept();
Hashtable<String, FormalConcept> conceptHash = new Hashtable<String, FormalConcept>();
conceptHash.put(topConcept.getExtent().toString(), topConcept);
LinkedList<FormalConcept> candidates = new LinkedList<FormalConcept>();
candidates.addLast(topConcept);
while (candidates.isEmpty() == false)
{
FormalConcept concept = candidates.getFirst();
Vector<FormalConcept> lowerCover = getLowerCover(concept.getExtent(), concept.getIntent());
for (int i = 0; i < lowerCover.size(); i++)
{
FormalConcept lowerConcept = lowerCover.elementAt(i);
FormalConcept child = conceptHash.get(lowerConcept.getExtent().toString());
if (child == null)
{
child = new FormalConcept(lowerConcept.getExtent(), lowerConcept.getIntent());
conceptHash.put(child.getExtent().toString(), child);
candidates.addLast(child);
}
if (!child.getIntent().equals(concept.getIntent()))
{
child.addParent(concept);
concept.addChild(child);
}
}
concepts.add(concept);
candidates.removeFirst();
}
}
public Vector<FormalConcept> getLowerCover(BasicSet extent, BasicSet intent)
{
Vector<FormalConcept> lowerCover = new Vector<FormalConcept>();
BasicSet allAtts = (BasicSet) intent.clone();
FormalConcept firstObj;
Iterator<String> it = extent.iterator();
while (allAtts.size() < attCount && (firstObj = getFirstObject(allAtts, it)) != null)// getFirstObject
{// allAtts.size()<attCount && 是自己加的
BasicSet objIntent = firstObj.getIntent();
BasicSet objExtent = firstObj.getExtent();
while (it.hasNext()) // 遍历完当前的外延中的所有对象extent 减去 getFirstObject遍历的对象extent1即extent-extent1
{// 刚开始遍历时,形成的概念的外延集比较大,所以内涵就小, 随后外延“小些” 内涵“大些”
FormalConcept nextObj = (getNextObject(it));// getNextObject
BasicSet tempIntent = nextObj.getIntent().intersection(objIntent);// 已经遍历的几个对象共同具有的内涵tempIntent
if (!(allAtts.containsAll(tempIntent))) // tempIntent中有新属性j,j不属于父概念的内涵
{
// 则新概念的外延(初始为firstObj的外延)加入当前对象。
// 新概念的内涵(初始为firstObj的内涵)赋值为:当前内涵和之前内涵的交集。
objExtent = objExtent.union(nextObj.getExtent());
objIntent = tempIntent;
}
}
if (objIntent.intersection(allAtts).equals(intent)) // 新的内涵包含父内涵,而且由于allAtts包含父内涵,所以除去allAtts新增属性前的情况
lowerCover.add(new FormalConcept(objExtent, objIntent));// objIntent都相比allAtts有新属性加入=》是新概念
allAtts = allAtts.union(objIntent);// allAtts增加了上面概念新增的属性
it = extent.iterator();// 将迭代器it恢复初始值
}
// Add the bottom concept to the lower cover
if ((lowerCover.size() == 0) && (intent.size() != attCount)) // 马上最后一层,且内涵还没有满
lowerCover.add(bottomConcept);
return lowerCover;
}
private FormalConcept getFirstObject(BasicSet intent, Iterator<String> it)
{
while (it.hasNext())
{
String currObj = it.next();
int numObj = (objects.get(currObj)).intValue();
FormalConcept first = initialConcepts.elementAt(numObj);
if (!intent.containsAll(first.getIntent()))
return new FormalConcept((BasicSet) first.getExtent().clone(), (BasicSet) first.getIntent().clone());
}
return null;
}
private FormalConcept getNextObject(Iterator<String> it)
{
if (it.hasNext())
{
String nextObject = it.next();
int numObj = (objects.get(nextObject)).intValue();
FormalConcept concept = initialConcepts.elementAt(numObj);
return new FormalConcept((BasicSet) concept.getExtent().clone(), (BasicSet) concept.getIntent().clone());
}
return null;
}
public Vector<FormalConcept> getConcepts()
{
return concepts;
}
转载请注明原文地址: https://ju.6miu.com/read-10552.html