¿Cuál de los siguientes no es un operador utilizado en los motores de búsqueda?
Con los comentarios anteriores, podemos saber que después de preparar las palabras clave de consulta y los archivos del diccionario, ingresaremos a la etapa de segmentación de palabras clave del usuario
//En TSESearch.cpp: p>
[csharp] ver copia simple
CHzSeg iHzSeg; //incluye ChSeg/HzSeg.h
//
iQuery.m_sSegQuery = iHzSeg. SegmentSentenceMM(iDict, iQuery.m_sQuery); //Dividimos la variable de consulta obtenida en "I/love/you/format"
vector
iQuery.ParseQuery(vecTerm); //Coloca las palabras clave separadas por "/" en un contenedor vectorial una por una
set
iQuery. GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);
gettimeofday(&end_tv,&tz
// fin de la búsqueda
//Búsqueda completada
<); p>[php] ver copia simpleMira este método en CHzSeg
[php] ver copia simple
//ChSeg/HzSeg.h
[html] ver copia simple
/**
* Instrucciones de traducción del programa
* Purifica aún más los datos y convierte caracteres chinos
* @access public
* @param CDict, cadena Descripción del parámetro en caracteres chinos: diccionario, cadena de consulta
* @return cadena 0
*/
// procesar una oración antes de la segmentación
//procesar una oración antes de la segmentación
string CHZSeg::SegmentSentenceMM (CDict &dict, string s1) const p>
{
string s2="";
unsigned int i,len
while (!s1.empty())
p>{
unsigned char ch=(unsigned char) s1[0];
if(ch<128)
{ / / trato con ASCII
i=1
len = s1.size();
mientras (i f="" Puntuación china y otros caracteres no chinos="" i="0;" len="s1.length();">
&& (!( (carácter sin firmar)s1[i]==161 && ((carácter sin firmar)s1[i+1]>=162 && (carácter sin firmar)s1[i+1]<=168)))
&& ( !((carácter sin firmar)s1[i]==161 && ((carácter sin firmar)s1[i+1]>=171 && (carácter sin firmar)s1[i+1]<=191)))
&& (!((carácter sin firmar)s1[i]==163 && ((carácter sin firmar)s1[i+1]==172 || (carácter sin firmar)s1[i+1]==161) p>
|| (carácter sin firmar)s1[i+1]==168 || (carácter sin firmar)s1[i+1]==169 || (carácter sin firmar)s1[i+1]= =186
|| (carácter sin firmar)s1[i+1]==187 || (carácter sin firmar)s1[i+1]==191)))
{ p>
i=i+2; // Supongamos que no hay medio carácter chino
}
if (i==0) i=i+2
// No procesa espacios chinos
if (!(ch==161 && (unsigned char)s1[1]==161))
{
if (i <= s1.size()) // yhf
// Otros caracteres de doble byte no chinos se pueden generar continuamente
s2 += s1.substr (0, i) + SEPARADOR;
else break; // yhf
}
if (i <= s1. tamaño()) // yhf
s1=s1.substr(i);
else break; //yhf
continuar; p> }
}
// Lo siguiente procesa cadenas de caracteres chinos
i = 2;
len = s1.length();
mientras(i
// mientras(i
i+=2
s2+=SegmentHzStrMM(dict, s1.substr(0,i; ));
if (i <= len) // yhf
s1=s1.substr(i);
else break; /p>
}
return s2;
}
[html] ver copia simple
[html] ver copia simple
//Query.cpp
[html] ver copia simple
/*** Instrucciones de traducción del programa
* Coloque las palabras clave separadas por "/" en un contenedor vectorial una por una
*
* @access public
* @param vector
Descripción en caracteres chinos del parámetro: contenedor de vectores * @return void
*/ p>
void CQuery::ParseQuery(vector
&vecTerm) {
string::size_type idx
while ( (idx; = m_sSegQuery.find("/ ")) != cadena::npos ) {
vecTerm.push_back(m_sSegQuery.substr(0,idx));
m_sSegQuery = m_sSegQuery. substr(idx+3);
}
}
/*** Instrucciones de traducción del programa
* Consulta de análisis de correlación, construcción del conjunto de resultados setRelevantRst //El cuello de botella
*
* @access public
p >* @param vector
conjunto de mapas Descripción de parámetros en caracteres chinos: el usuario envía la clave Segmentación de palabras, mapeo de índice invertido, conjunto de resultados de correlación
* @return string 0
*/
bool CQuery::GetRelevantRst
(
vector
&vecTerm, mapa &mapBuckets,
set
&setRelevantRst p> ) const
{
set
setSRst bool bFirst=true
vector
::iterador itTerm = vecTerm.begin(); for ( ; itTerm != vecTerm.end(); ++itTerm )
{
setSRst.clear();
copiar(setRelevantRst.begin(), setRelevantRst.end(), inserter(setSRst,setSRst.begin())); mapa mapRstDoc
string docid
int doccnt;
map::iterator itBuckets = mapBuckets.find(*itTerm);
if (itBuckets != mapBuckets.end())
{
cadena strBucket = (*itBuckets).segundo
cadena: :size_type; idx;
idx = strBucket.find_first_not_of(" ");
strBucket = strBucket.substr(idx);
mientras ( (idx = strBucket .find) (" ")) != cadena::npos )
{
docid = strBucket.substr(0,idx);
doccnt = 0 ; /p>
if (docid.empty()) continuar;
map::iterator it = mapRstDoc.find(docid);
if ( it != mapRstDoc. fin() )
{
doccnt = (*it).segundo + 1;
mapRstDoc.erase(it);
}
mapRstDoc. insert( pair(docid,doccnt) );
strBucket = strBucket.substr(idx+1);
}
// recuerda el último
docid = strBucket;
doccnt = 0;
map::iterator it = mapRstDoc.find(docid); it != mapRstDoc.end() )
{
doccnt = (*it).segundo + 1
mapRstDoc.erase(it); /p>
}
mapRstDoc.insert( pair(docid,doccnt)
}
// ordenar por frecuencia de término
multimapa > nuevoRstDoc;
mapa::iterador it0 = mapRstDoc.begin();
for ( ; it0 != mapRstDoc.end(); ++it0 ) {
newRstDoc.insert( pair((*it0).segundo,(*it0).first)
}
multimap::iterator itNewRstDoc. = newRstDoc.begin();
setRelevantRst.clear();
para ( ; itNewRstDoc != newRstDoc.end(); ++itNewRstDoc ){
cadena docid = (*itNewRstDoc).segundo;
if (bFirst==true) {
setRelevantRst.insert(docid); /p>
}
if ( setSRst.find(docid) != setSRst.end() ){
setRel
evantRst.insert(docid);
}
}
//cout << "setRelevantRst.size(): " << setRelevantRst.size() << "
";bFirst = falso;
}
devuelve verdadero; /p>
Lo siguiente es la realidad