private boolean expandKeywordsByChi(double ratio){
		int wordID, aspectID, selID = -1;
		double maxChi, chiV;
		Iterator<Map.Entry<String, Integer>> vIt = m_vocabulary.entrySet().iterator();
		while(vIt.hasNext()){//first iteration, select the maxAspect
			Map.Entry<String, Integer> entry = vIt.next();
			wordID = entry.getValue();
			
			maxChi = 0.0;
			selID = -1;
			for(aspectID=0; aspectID<m_keywords.size(); aspectID++){
				if ((chiV=m_chi_table[aspectID][wordID]) > ratio * maxChi){
					maxChi = chiV;
					selID = aspectID;
				}
			}
			
			for(aspectID=0; aspectID<m_keywords.size(); aspectID++){
				if (aspectID!=selID)
					m_chi_table[aspectID][wordID] = 0.0;
			}
		}
		
		aspectID = 0;
		boolean extended = false;
		for(int i=0; i<m_keywords.size(); i++){	
			_Aspect asp = m_keywords.get(i);
			for(rank_item<String> item : m_ranklist){//second iteration, select the maxAspect
				wordID = m_vocabulary.get(item.m_name);
				item.m_value = m_chi_table[aspectID][wordID];	
			}
			
			Collections.sort(m_ranklist);
			for(wordID=0; wordID<chi_size; wordID++){
				if (asp.m_keywords.add(m_ranklist.get(wordID).m_name))
					extended = true;
			}
			aspectID ++;
		}
		return extended;
	}