北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序

本文主要是介绍北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有前面注释我们可以知道查询关键字和字典文件准备好好后,将进入用户关键字分词阶段

//TSESearch.cpp中:

view plain copy to clipboard print ?
  1. CHzSeg iHzSeg;      //include ChSeg/HzSeg.h   
  2.   
  3. //   
  4. iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);  //将get到的查询变量分词分成 "我/        爱/      你们/ 的/      格式"   
  5.   
  6. vector<STRING></STRING> vecTerm;   
  7. iQuery.ParseQuery(vecTerm);     //将以"/"划分开的关键字一一顺序放入一个向量容器中   
  8.   
  9. set<STRING></STRING> setRelevantRst;    
  10. iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);    
  11.   
  12. gettimeofday(&end_tv,&tz);   
  13. // search end   
  14. //搜索完毕  
	CHzSeg iHzSeg;		//include ChSeg/HzSeg.h
//
iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);	//将get到的查询变量分词分成 "我/		爱/		你们/	的/		格式"
vector vecTerm;
iQuery.ParseQuery(vecTerm);		//将以"/"划分开的关键字一一顺序放入一个向量容器中
set setRelevantRst; 
iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst); 
gettimeofday(&end_tv,&tz);
// search end
//搜索完毕
view plain copy to clipboard print ?
  1. 看CHzSeg 中的这个方法  
看CHzSeg 中的这个方法
view plain copy to clipboard print ?
  1. //ChSeg/HzSeg.h  
//ChSeg/HzSeg.h
view plain copy to clipboard print ?
  1. /**   
  2.  * 程序翻译说明   
  3.  * 进一步净化数据,转换汉字   
  4.  * @access  public   
  5.  * @param   CDict, string 参数的汉字说明:字典,查询字符串   
  6.  * @return  string 0   
  7.  */   
  8. // process a sentence before segmentation   
  9. //在分词前处理句子   
  10. string CHzSeg::SegmentSentenceMM (CDict &dict, string s1) const   
  11. {   
  12.     string s2="";   
  13.     unsigned int i,len;   
  14.   
  15.     while (!s1.empty())    
  16.     {   
  17.         unsigned char ch=(unsigned char) s1[0];   
  18.         if(ch<128)    
  19.         { // deal with ASCII   
  20.             i=1;   
  21.             len = s1.size();   
  22.             while (i<LEN len="s1.length();" i="0;" 中文标点等非汉字字符="" if="" else="" yhf="" s1="s1.substr(i);" by="" added="" ch="=13)" s2="" cr=""></LEN>=161)   
  23.               && (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=162 && (unsigned char)s1[i+1]<=168)))   
  24.               && (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=171 && (unsigned char)s1[i+1]<=191)))   
  25.               && (!((unsigned char)s1[i]==163 && ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161)    
  26.               || (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186   
  27.               || (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191)))    
  28.                 {    
  29.                     ii=i+2; // 假定没有半个汉字   
  30.                 }   
  31.   
  32.                 if (i==0) ii=i+2;   
  33.   
  34.                 // 不处理中文空格   
  35.                 if (!(ch==161 && (unsigned char)s1[1]==161))    
  36.                 {    
  37.                     if (i <= s1.size())  // yhf   
  38.                         // 其他的非汉字双字节字符可能连续输出   
  39.                         s2 += s1.substr(0, i) + SEPARATOR;    
  40.                     else break; // yhf   
  41.                 }   
  42.   
  43.                 if (i <= s1.size())  // yhf   
  44.                     s1s1=s1.substr(i);   
  45.                 else break;     //yhf   
  46.   
  47.                 continue;   
  48.             }   
  49.         }   
  50.        
  51.   
  52.     // 以下处理汉字串   
  53.   
  54.         i = 2;   
  55.         len = s1.length();   
  56.   
  57.         while(i<LEN></LEN>=176)    
  58. //    while(i<LEN></LEN>=128 && (unsigned char)s1[i]!=161)   
  59.             i+=2;   
  60.   
  61.         s2+=SegmentHzStrMM(dict, s1.substr(0,i));   
  62.   
  63.         if (i <= len)    // yhf   
  64.             s1s1=s1.substr(i);   
  65.         else break; // yhf   
  66.     }   
  67.   
  68.     return s2;   
  69. }  
/**
* 程序翻译说明
* 进一步净化数据,转换汉字
* @access  public
* @param   CDict, string 参数的汉字说明:字典,查询字符串
* @return  string 0
*/
// process a sentence before segmentation
//在分词前处理句子
string CHzSeg::SegmentSentenceMM (CDict &dict, string s1) const
{
string s2="";
unsigned int i,len;
while (!s1.empty()) 
{
unsigned char ch=(unsigned char) s1[0];
if(ch<128) 
{ // deal with ASCII
i=1;
len = s1.size();
while (i=161)
&& (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=162 && (unsigned char)s1[i+1]<=168)))
&& (!((unsigned char)s1[i]==161 && ((unsigned char)s1[i+1]>=171 && (unsigned char)s1[i+1]<=191)))
&& (!((unsigned char)s1[i]==163 && ((unsigned char)s1[i+1]==172 || (unsigned char)s1[i+1]==161) 
|| (unsigned char)s1[i+1]==168 || (unsigned char)s1[i+1]==169 || (unsigned char)s1[i+1]==186
|| (unsigned char)s1[i+1]==187 || (unsigned char)s1[i+1]==191))) 
{ 
i=i+2; // 假定没有半个汉字
}
if (i==0) i=i+2;
// 不处理中文空格
if (!(ch==161 && (unsigned char)s1[1]==161)) 
{ 
if (i <= s1.size())	// yhf
// 其他的非汉字双字节字符可能连续输出
s2 += s1.substr(0, i) + SEPARATOR; 
else break; // yhf
}
if (i <= s1.size())	// yhf
s1=s1.substr(i);
else break;		//yhf
continue;
}
}
// 以下处理汉字串
i = 2;
len = s1.length();
while(i=176) 
//    while(i=128 && (unsigned char)s1[i]!=161)
i+=2;
s2+=SegmentHzStrMM(dict, s1.substr(0,i));
if (i <= len)	// yhf
s1=s1.substr(i);
else break;	// yhf
}
return s2;
}
view plain copy to clipboard print ?
  1.    
 
view plain copy to clipboard print ?
  1. //Query.cpp  
//Query.cpp
view plain copy to clipboard print ?
  1. <PRE class=csharp name="code">/**   
  2.  * 程序翻译说明   
  3.  * 将以"/"划分开的关键字一一顺序放入一个向量容器中   
  4.  *   
  5.  * @access  public   
  6.  * @param   vector<STRING></STRING> 参数的汉字说明:向量容器   
  7.  * @return  void   
  8.  */   
  9. void CQuery::ParseQuery(vector<STRING></STRING> &vecTerm)   
  10. {   
  11.     string::size_type idx;    
  12.     while ( (idx = m_sSegQuery.find("/  ")) != string::npos ) {    
  13.         vecTerm.push_back(m_sSegQuery.substr(0,idx));    
  14.         m_sSegQuerym_sSegQuery = m_sSegQuery.substr(idx+3);    
  15.     }   
  16. }   
  17. </PRE>  
  18. <PRE class=csharp name="code"> </PRE>  
  19. <PRE class=csharp name="code"><PRE class=csharp name="code">/**   
  20.  * 程序翻译说明   
  21.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在   
  22.  *   
  23.  * @access  public   
  24.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合   
  25.  * @return  string 0   
  26.  */   
  27. bool CQuery::GetRelevantRst   
  28. (   
  29.     vector<STRING></STRING> &vecTerm,    
  30.     map &mapBuckets,    
  31.     set<STRING></STRING> &setRelevantRst   
  32. ) const   
  33. {   
  34.     set<STRING></STRING> setSRst;   
  35.   
  36.     bool bFirst=true;   
  37.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  38.   
  39.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  40.     {   
  41.   
  42.         setSRst.clear();   
  43.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  44.   
  45.         map mapRstDoc;   
  46.         string docid;   
  47.         int doccnt;   
  48.   
  49.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  50.         if (itBuckets != mapBuckets.end())   
  51.         {   
  52.             string strBucket = (*itBuckets).second;   
  53.             string::size_type idx;   
  54.             idx = strBucket.find_first_not_of(" ");   
  55.             strBucketstrBucket = strBucket.substr(idx);   
  56.   
  57.             while ( (idx = strBucket.find(" ")) != string::npos )    
  58.             {   
  59.                 docid = strBucket.substr(0,idx);   
  60.                 doccnt = 0;   
  61.   
  62.                 if (docid.empty()) continue;   
  63.   
  64.                 map::iterator it = mapRstDoc.find(docid);   
  65.                 if ( it != mapRstDoc.end() )   
  66.                 {   
  67.                     doccnt = (*it).second + 1;   
  68.                     mapRstDoc.erase(it);   
  69.                 }   
  70.                 mapRstDoc.insert( pair(docid,doccnt) );   
  71.   
  72.                 strBucketstrBucket = strBucket.substr(idx+1);   
  73.             }   
  74.   
  75.             // remember the last one   
  76.             docid = strBucket;   
  77.             doccnt = 0;   
  78.             map::iterator it = mapRstDoc.find(docid);   
  79.             if ( it != mapRstDoc.end() )   
  80.             {   
  81.                 doccnt = (*it).second + 1;   
  82.                 mapRstDoc.erase(it);   
  83.             }   
  84.             mapRstDoc.insert( pair(docid,doccnt) );   
  85.         }   
  86.   
  87.         // sort by term frequencty   
  88.         multimap > newRstDoc;   
  89.         map::iterator it0 = mapRstDoc.begin();   
  90.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  91.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  92.         }   
  93.   
  94.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  95.         setRelevantRst.clear();   
  96.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  97.             string docid = (*itNewRstDoc).second;   
  98.   
  99.             if (bFirst==true) {   
  100.                 setRelevantRst.insert(docid);   
  101.                 continue;   
  102.             }   
  103.   
  104.             if ( setSRst.find(docid) != setSRst.end() ){       
  105.                 setRelevantRst.insert(docid);   
  106.             }   
  107.         }   
  108.   
  109.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  110.         bFirst = false;   
  111.     }   
  112.     return true;   
  113. }</PRE>  
  114. </PRE>  
  115. 接下来的就是现实了,前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多,格式化结果集合并显示出来。  
view plaincopy to clipboardprint?
  1. /**  
  2.  * 程序翻译说明  
  3.  * 将以"/"划分开的关键字一一顺序放入一个向量容器中  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> 参数的汉字说明:向量容器  
  7.  * @return  void  
  8.  */  
  9. void CQuery::ParseQuery(vector<STRING></STRING> &vecTerm)   
  10. {   
  11.     string::size_type idx;    
  12.     while ( (idx = m_sSegQuery.find("/  ")) != string::npos ) {    
  13.         vecTerm.push_back(m_sSegQuery.substr(0,idx));    
  14.         m_sSegQuery = m_sSegQuery.substr(idx+3);    
  15.     }   
  16. }  
view plaincopy to clipboardprint?
  1.    
 
view plaincopy to clipboardprint?
  1. <PRE class=csharp name="code">/**  
  2.  * 程序翻译说明  
  3.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合  
  7.  * @return  string 0  
  8.  */  
  9. bool CQuery::GetRelevantRst   
  10. (   
  11.     vector<STRING></STRING> &vecTerm,    
  12.     map &mapBuckets,    
  13.     set<STRING></STRING> &setRelevantRst   
  14. const  
  15. {   
  16.     set<STRING></STRING> setSRst;   
  17.   
  18.     bool bFirst=true;   
  19.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  20.   
  21.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  22.     {   
  23.   
  24.         setSRst.clear();   
  25.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  26.   
  27.         map mapRstDoc;   
  28.         string docid;   
  29.         int doccnt;   
  30.   
  31.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  32.         if (itBuckets != mapBuckets.end())   
  33.         {   
  34.             string strBucket = (*itBuckets).second;   
  35.             string::size_type idx;   
  36.             idx = strBucket.find_first_not_of(" ");   
  37.             strBucket = strBucket.substr(idx);   
  38.   
  39.             while ( (idx = strBucket.find(" ")) != string::npos )    
  40.             {   
  41.                 docid = strBucket.substr(0,idx);   
  42.                 doccnt = 0;   
  43.   
  44.                 if (docid.empty()) continue;   
  45.   
  46.                 map::iterator it = mapRstDoc.find(docid);   
  47.                 if ( it != mapRstDoc.end() )   
  48.                 {   
  49.                     doccnt = (*it).second + 1;   
  50.                     mapRstDoc.erase(it);   
  51.                 }   
  52.                 mapRstDoc.insert( pair(docid,doccnt) );   
  53.   
  54.                 strBucket = strBucket.substr(idx+1);   
  55.             }   
  56.   
  57.             // remember the last one   
  58.             docid = strBucket;   
  59.             doccnt = 0;   
  60.             map::iterator it = mapRstDoc.find(docid);   
  61.             if ( it != mapRstDoc.end() )   
  62.             {   
  63.                 doccnt = (*it).second + 1;   
  64.                 mapRstDoc.erase(it);   
  65.             }   
  66.             mapRstDoc.insert( pair(docid,doccnt) );   
  67.         }   
  68.   
  69.         // sort by term frequencty   
  70.         multimap > newRstDoc;   
  71.         map::iterator it0 = mapRstDoc.begin();   
  72.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  73.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  74.         }   
  75.   
  76.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  77.         setRelevantRst.clear();   
  78.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  79.             string docid = (*itNewRstDoc).second;   
  80.   
  81.             if (bFirst==true) {   
  82.                 setRelevantRst.insert(docid);   
  83.                 continue;   
  84.             }   
  85.   
  86.             if ( setSRst.find(docid) != setSRst.end() ){       
  87.                 setRelevantRst.insert(docid);   
  88.             }   
  89.         }   
  90.   
  91.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  92.         bFirst = false;   
  93.     }   
  94.     return true;   
  95. }</PRE>  
view plaincopy to clipboardprint?
  1. /**  
  2.  * 程序翻译说明  
  3.  * 相关性分析查询,构造结果集合setRelevantRst //瓶颈所在  
  4.  *  
  5.  * @access  public  
  6.  * @param   vector<STRING></STRING> map set<STRING></STRING> 参数的汉字说明: 用户提交关键字的分词组,倒排索引映射,相关性结果集合  
  7.  * @return  string 0  
  8.  */  
  9. bool CQuery::GetRelevantRst   
  10. (   
  11.     vector<STRING></STRING> &vecTerm,    
  12.     map &mapBuckets,    
  13.     set<STRING></STRING> &setRelevantRst   
  14. const  
  15. {   
  16.     set<STRING></STRING> setSRst;   
  17.   
  18.     bool bFirst=true;   
  19.     vector<STRING></STRING>::iterator itTerm = vecTerm.begin();   
  20.   
  21.     for ( ; itTerm != vecTerm.end(); ++itTerm )   
  22.     {   
  23.   
  24.         setSRst.clear();   
  25.         copy(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin()));   
  26.   
  27.         map mapRstDoc;   
  28.         string docid;   
  29.         int doccnt;   
  30.   
  31.         map::iterator itBuckets = mapBuckets.find(*itTerm);   
  32.         if (itBuckets != mapBuckets.end())   
  33.         {   
  34.             string strBucket = (*itBuckets).second;   
  35.             string::size_type idx;   
  36.             idx = strBucket.find_first_not_of(" ");   
  37.             strBucket = strBucket.substr(idx);   
  38.   
  39.             while ( (idx = strBucket.find(" ")) != string::npos )    
  40.             {   
  41.                 docid = strBucket.substr(0,idx);   
  42.                 doccnt = 0;   
  43.   
  44.                 if (docid.empty()) continue;   
  45.   
  46.                 map::iterator it = mapRstDoc.find(docid);   
  47.                 if ( it != mapRstDoc.end() )   
  48.                 {   
  49.                     doccnt = (*it).second + 1;   
  50.                     mapRstDoc.erase(it);   
  51.                 }   
  52.                 mapRstDoc.insert( pair(docid,doccnt) );   
  53.   
  54.                 strBucket = strBucket.substr(idx+1);   
  55.             }   
  56.   
  57.             // remember the last one   
  58.             docid = strBucket;   
  59.             doccnt = 0;   
  60.             map::iterator it = mapRstDoc.find(docid);   
  61.             if ( it != mapRstDoc.end() )   
  62.             {   
  63.                 doccnt = (*it).second + 1;   
  64.                 mapRstDoc.erase(it);   
  65.             }   
  66.             mapRstDoc.insert( pair(docid,doccnt) );   
  67.         }   
  68.   
  69.         // sort by term frequencty   
  70.         multimap > newRstDoc;   
  71.         map::iterator it0 = mapRstDoc.begin();   
  72.         for ( ; it0 != mapRstDoc.end(); ++it0 ){   
  73.             newRstDoc.insert( pair((*it0).second,(*it0).first) );   
  74.         }   
  75.   
  76.         multimap::iterator itNewRstDoc = newRstDoc.begin();   
  77.         setRelevantRst.clear();   
  78.         for ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){   
  79.             string docid = (*itNewRstDoc).second;   
  80.   
  81.             if (bFirst==true) {   
  82.                 setRelevantRst.insert(docid);   
  83.                 continue;   
  84.             }   
  85.   
  86.             if ( setSRst.find(docid) != setSRst.end() ){       
  87.                 setRelevantRst.insert(docid);   
  88.             }   
  89.         }   
  90.   
  91.         //cout << "setRelevantRst.size(): " << setRelevantRst.size() << "<BR>";   
  92.         bFirst = false;   
  93.     }   
  94.     return true;   
  95. }  
接下来的就是现实了,前面都只是处理数据得到 setRelevantRst 这个查询结构集合,这里就不多说了下面就和php之类的脚本语言差不多,格式化结果集合并显示出来。

//TSESearch.cpp

view plain copy to clipboard print ?
  1. //下面开始显示   
  2.     CDisplayRst iDisplayRst;    
  3.     iDisplayRst.ShowTop();    
  4.   
  5.     float used_msec = (end_tv.tv_sec-begin_tv.tv_sec)*1000    
  6.         +((float)(end_tv.tv_usec-begin_tv.tv_usec))/(float)1000;    
  7.   
  8.     iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec,    
  9.             setRelevantRst.size(), iQuery.m_iStart);   
  10.   
  11.     iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart); 

这篇关于北大天网搜索引擎TSE分析及完全注释[3]来到关键字分词及相关性分析程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/670220

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

Spring、Spring Boot、Spring Cloud 的区别与联系分析

《Spring、SpringBoot、SpringCloud的区别与联系分析》Spring、SpringBoot和SpringCloud是Java开发中常用的框架,分别针对企业级应用开发、快速开... 目录1. Spring 框架2. Spring Boot3. Spring Cloud总结1. Sprin

Python中的输入输出与注释教程

《Python中的输入输出与注释教程》:本文主要介绍Python中的输入输出与注释教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、print 输出功能1. 基础用法2. 多参数输出3. 格式化输出4. 换行控制二、input 输入功能1. 基础用法2. 类

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间