📄 whfhost.js
字号:
if ( a_Tile.aWords[i].nWordId == a_Word.nWordId )
{
if ( a_Tile.aWords[i].nWordForm == WORDSHAPE_SYNONYM )
eCur = EWMT_SynonymMatch;
else
{
if ( _isUpperCaseShape( a_Word.nWordShape ) )
{
if ( a_Word.nWordShape == a_Tile.aWords[i].nWordForm )
eCur = EWMT_ShapeMatch;
else
eCur = EWMT_NotMatch;
}
else
{
if ( a_Word.nWordShape == a_Tile.aWords[i].nWordForm ||
a_Word.nWordShape == a_Tile.aWords[i].nWordForm - 1 )
eCur = EWMT_ShapeMatch;
else
eCur = EWMT_WordMatch;
}
}
}
if ( eRslt < eCur )
eRslt = eCur;
}
return eRslt;
}
function _getTermMatchType( a_aTiles, a_nTileFrom, a_aWords, a_nFrom, a_nLen )
{
var eRslt = EWMT_ShapeMatch;
if ( a_nFrom < 0 || a_nLen <= 0 || a_aWords.length < a_nFrom + a_nLen )
return EWMT_NotMatch;
var nOffset = a_nTileFrom ;
var j = a_nTileFrom;
for ( var i = a_nFrom; i < a_nFrom + a_nLen; i++ )
{
nOffset = nOffset - a_aWords[i].nWordId
j = nOffset + a_aWords[i].nWordId; //seek j to the tile that should be matched
if ( !a_aTiles[j] )
return EWMT_NotMatch;
var eCur = _getWordMatchType( a_aWords[i], a_aTiles[j], j, nOffset );
if ( eCur < eRslt )
eRslt = eCur;
if ( eRslt == EWMT_NotMatch )
return eRslt;
nOffset = nOffset + a_aWords[i].strWord.length + a_aWords[i].nWordId ;
}
return eRslt;
}
function _matchTypeToScore( a_eMatchType )
{
switch( a_eMatchType )
{
case EWMT_NotMatch: return 0;
case EWMT_SynonymMatch: return 1;
case EWMT_WordMatch: return 2;
case EWMT_ShapeMatch: return 4;
default: return 0;
}
}
function _computeSingleWordScore( a_TopicImage, a_nWordId )
{
if ( !a_TopicImage.aWords[a_nWordId] )
return 0.0;
var emphasis = a_TopicImage.aWords[a_nWordId].uEmphasis ;
if (emphasis == 0 )
emphasis = a_TopicImage.aWords[a_nWordId].uFreq;
else
emphasis = _emphasisToScore(emphasis ) ;
var fWeightScore = _rank_Weaken( _rank_ULaw( emphasis ), WEIGHT_OF_SINGLE_WORD_SCORE );
if ( _isTitle( a_TopicImage.aWords[a_nWordId].uEmphasis ) ) // Words in title are important than key words and the rest.
{
return fWeightScore / 3.0 + 2.0 / 3.0;
}
if ( _isKeyWord( a_TopicImage.aWords[a_nWordId].uEmphasis ) ) // Key words are always more important than non-keywords.
{
return fWeightScore / 3.0 + 1.0 / 3.0;
}
else
{
return fWeightScore / 3.0;
}
}
function _computeTermWeight( a_TopicImage, a_Term )
{
var nTermLen = a_Term.aWords.length; // empty term means ignored or all stop words
if ( nTermLen == 0 )
return -1.0;
var fTermScore = 0.0; // position independent score
for ( i = 0; i < nTermLen; i++ )
fTermScore += _computeSingleWordScore( a_TopicImage, a_Term.aWords[i].nWordId );
if ( a_Term.eType == ESNT_PHRASE )
{
//check if its a phrase
var bPhrase = false ;
var iPosition = 0;
for ( var strPosition in a_TopicImage.aTiles )
{
iPosition = parseInt( strPosition );
bPhrase = _getPhraseMatch( a_TopicImage.aTiles, iPosition, a_Term.aWords, 0 );
if ( bPhrase )
break ;
}
if (bPhrase)
return fTermScore;
else
return 0.0 ;
}
else
{
return fTermScore;
}
}
function _getPhraseMatch(a_aTiles, iPosition, a_aWords, a_nCurIdx )
{
var nOffset = iPosition ;
if (a_nCurIdx >= a_aWords.length)
return false ;
if (iPosition >= a_aTiles.length)
return false ;
var nCurWordId = a_aWords[a_nCurIdx].nWordId ;
if(!a_aTiles[iPosition])
return false ;
var wordAtPos = a_aTiles[iPosition].aWords[0].nWordId ;
if (wordAtPos == nCurWordId)
{
if (a_nCurIdx == (a_aWords.length -1 ))
{
//last word matches, then return true
return true ;
}
else
{
var wordLen = a_aWords[a_nCurIdx].strWord.length ;
return _getPhraseMatch(a_aTiles , iPosition + wordLen , a_aWords , a_nCurIdx+1);
}
}
else
return false ;
}
function _removeNegativeWeight( a_fWeight, a_eOpType )
{
if ( a_fWeight >= 0.0 )
return a_fWeight;
switch ( a_eOpType )
{
case ESNT_OR: return 0.0;
case ESNT_AND: return 1.0;
case ESNT_NOT: return 0.0;
}
return 0.0;
}
function _getWeightOfNode( a_TopicImage, a_Node )
{
if ( a_Node == null )
return 0.0;
if ( a_Node.eType == ESNT_DEFAULT || a_Node.eType == ESNT_PHRASE || a_Node.eType == ESNT_NOT)
{
return _computeTermWeight( a_TopicImage, a_Node );
}
else
{
// Right has only 1/2 weight of left
var fWeightRight = _getWeightOfNode( a_TopicImage, a_Node.right ) / 2.0;
var fWeightLeft = _getWeightOfNode( a_TopicImage, a_Node.left );
// To both negativeWeight return negative
if ( fWeightRight < 0.0 && fWeightLeft < 0.0 )
return -1.0;
// Convert NegativeWeight to 1.0 or 0.0 according to operator type
fWeightRight = _removeNegativeWeight( fWeightRight, a_Node.eType );
fWeightLeft = _removeNegativeWeight( fWeightLeft, a_Node.eType );
// Boolean operation
switch ( a_Node.eType )
{
case ESNT_OR:
return ( fWeightLeft + fWeightRight ) / 2.0;
case ESNT_AND:
return ( fWeightLeft * fWeightRight );
case ESNT_NOT:
fWeightRight = ( fWeightRight == 0.0 ) ? 1.0 : 0.0;
return fWeightLeft * fWeightRight;
}
// Uncoverd cases (inexistent).
return 0.0;
}
}
function calculateRanking( a_TopicImage, a_Expression )
{
return _getWeightOfNode( a_TopicImage, a_Expression );
}
// HuginHunter.js-------------------------------
function arrayRemoveAt( a_ary, a_nIndex )
{
var nLen = a_ary.length;
for ( var i = a_nIndex; i < nLen - 1; i++ )
a_ary[i] = a_ary[i + 1];
a_ary.length--;
}
function HuginQueryResult()
{
this.aTopics = new Array();
}
function HuginImageWord()
{
this.uEmphasis = 0;
this.uFreq = 0;
};
function HuginImageTileWord( a_nWordId, a_nWordForm )
{
this.nWordId = a_nWordId;
this.nWordForm = a_nWordForm;
}
function HuginImageTile()
{
this.aWords = new Array();
}
function HuginTopicImage( a_nTopicId )
{
this.aWords = new Array();
this.aTiles = new Array();;
}
function HuginHunter()
{
this.aOdbPathes = null; //in
this.strOdbPath = null; //in
this.strQuery = null; //in
this.queryResult = null; //out
this.bInited = false;
this.bSucc = true;
this.aDatabases = null;
this.iCurProj = null;
this.queryExpression = null;
this.queryWord = null;
this.curTermNode = null;
this.aRecordTable = null;
this.aSuspendTopics = null;
this.aTopics = null;
this.iCurTopic = null;
this.aTopicImages = null;
this.aNodeStack = null;
this.iCurTermNodeWord = null;
this.aPossibleOrgs = null;
this.aRankedTopics = null;
this.nWordLoaded = 0;
this.nWordNum = 0;
this.nState = 0;
this.nProgress = 0;
this.prepareQuery = function()
{
this.queryResult = null;
this.bSucc = true;
this.iCurProj = 0;
this.queryExpression = null;
this.queryWord = null;
this.curTermNode = null;
this.aRecordTable = null;
this.aSuspendTopics = null;
this.aTopics = null;
this.iCurTopic = 0;
this.aTopicImages = null;
this.aNodeStack = null;
this.iCurTermNodeWord = 0;
this.aPossibleOrgs = null;
this.aRankedTopics = null;
this.nWordLoaded = 0;
this.nWordNum = 0;
this.nState = 0;
this.nProgress = 0;
for ( var i in this.aDatabases )
this.aDatabases[i].prepareQuery();
}
this.updateProgress = function()
{
var fProgress = 100 * this.iCurProj / this.aDatabases.length;
var fBase = 100 / this.aDatabases.length;
if ( this.nState == 1 )
this.nProgress = Math.round( fProgress + ( this.nWordLoaded / this.nWordNum ) * ( fBase / 3 ) );
else if ( this.nState == 2 )
this.nProgress = Math.round( fProgress + fBase / 3 +
( this.iCurTopic / this.aTopics.length ) * ( fBase * 2 / 3 ) );
}
this.incCurProjForInit = function( a_Context, a_this )
{
a_this.iCurProj++;
if ( a_this.iCurProj < a_this.aDatabases.length )
{
a_Context.push( a_this.aDatabases[a_this.iCurProj].init, a_this.aDatabases[a_this.iCurProj],
a_this.incCurProjForInit, a_this );
}
}
this.incCurProjForEvaluate = function( a_Context, a_this )
{
a_this.iCurProj++;
if ( a_this.iCurProj < a_this.aDatabases.length )
{
a_this.aRankedTopics[a_this.iCurProj] = new Array();
a_Context.push( a_this.getRecords, a_this,
a_this.evaluateTopics, a_this,
a_this.getTopicInfo, a_this,
a_this.incCurProjForEvaluate, a_this );
}
}
this.incCurTermNodeWord = function( a_Context, a_this )
{
a_this.nState = 1;
a_this.iCurTermNodeWord++;
a_this.nWordLoaded++;
a_this.updateProgress();
}
this.incCurTopic = function( a_Context, a_this )
{
a_this.nState = 2;
a_this.iCurTopic++;
a_this.updateProgress();
}
this.checkInitSucc = function( a_Context, a_this )
{
var bAllFailed = true;
var bNotAllDatabaseInited = false;
a_this.bInited = false;
for ( var i = 0; i < a_this.aDatabases.length; i++ )
{
if ( !a_this.aDatabases[i].bSucc || !a_this.aDatabases[i].bInited )
bNotAllDatabaseInited = true;
else
bAllFailed = false;
}
if ( bAllFailed )
{
a_Context.strMsg = gsInitDatabaseFailed;
g_CurState = ECS_FATALERROR;
updateResultView();
return;
}
if ( bNotAllDatabaseInited )
{
a_Context.strMsg = gsInitDatabaseFailed;
}
a_Context.strMsg = "";
g_CurState = ECS_FTSREADY;
a_this.bInited = true;
}
this.getWordImageToAdd = function( a_nWordId, a_aWords )
{
return a_aWords[a_nWordId] ? a_aWords[a_nWordId] : ( a_aWords[a_nWordId] = new HuginImageWord() );
}
this.getTileImageToAdd = function( a_nPosition, a_aTiles )
{
return a_aTiles[a_nPosition] ? a_aTiles[a_nPosition] : ( a_aTiles[a_nPosition] = new HuginImageTile() );
}
this.addRecordToRecordTable = function( a_nWordId, a_strRecord )
{
if ( a_strRecord == "" )
return;
if(typeof(this.aRecordTable[a_nWordId]) == "undefined")
this.aRecordTable[a_nWordId] = new Array();
var aTopics = a_strRecord.split( "|" );
for ( var iTopic = 0; iTopic < aTopics.length; iTopic++ )
{
var topicHead = aTopics[iTopic].match( "^(\\d+),(.*)$" );
if ( topicHead == null )
continue;
this.aRecordTable[a_nWordId][topicHead[1]] = topicHead[2];
this.aSuspendTopics[topicHead[1]] = true;
}
}
this.processRecordResult = function( a_Context, a_this )
{
if ( !a_this.aDatabases[a_this.iCurProj].bSucc ) // Go on searching for other words while one not found
return;
a_this.wordRecord = a_this.aDatabases[a_this.iCurProj].recordResult;
a_this.addRecordToRecordTable( a_this.queryWord.nWordId, a_this.wordRecord.strRecord );
}
this.getRecordOfTermWord = function( a_Context, a_this )
{
if ( a_this.iCurTermNodeWord >= a_this.curTermNode.aWords.length )
return;
a_this.queryWord = a_this.curTermNode.aWords[a_this.iCurTermNodeWord];
a_this.aDatabases[a_this.iCurProj].queryWord = a_this.queryWord;
a_this.aDatabases[a_this.iCurProj].eType = a_this.curTermNode.eType ;
a_this.aDatabases[a_this.iCurProj].bNeedStopWord = a_this.bNeedStopWord;
a_Context.push( a_this.aDatabases[a_this.iCurProj].queryRecord, a_this.aDatabases[a_this.iCurProj],
a_this.processRecordResult, a_this,
a_this.incCurTermNodeWord, a_this,
a_this.getRecordOfTermWord, a_this );
}
this.getRecordOfTermNode = function( a_Context, a_this )
{
a_this.aPossibleOrgs = new Array();
a_this.bNeedStopWord = ( a_this.curTermNode.eType == ESNT_PHRASE );
a_this.iCurTermNodeWord = 0; //Init the iterator of a "for loop"
a_Context.push( a_this.getRecordOfTermWord, a_this);
}
this.getRecordOfNode = function( a_Context, a_this )
{
if ( a_this.aNodeStack.length == 0 )
return;
var curNode = a_this.aNodeStack[a_this.aNodeStack.length - 1];
a_this.aNodeStack.length--;
if ( curNode != null )
{
if ( curNode.eType == ESNT_PHRASE || curNode.eType == ESNT_DEFAULT || curNode.eType == ESNT_NOT)
{
a_this.curTermNode = curNode;
a_Context.push( a_this.getRecordOfTermNode, a_this );
}
else
{
a_this.aNodeStack[a_this.aNodeStack.length] = curNode.right;
a_this.aNodeStack[a_this.aNodeStack.length] = curNode.left;
a_Context.push( a_this.getRecordOfNode, a_this,
a_this.getRecordOfNode, a_this );
}
}
}
this.addToTopicImage = function( a_Image, a_nWordId, a_Record )
{
var wordImage = this.getWordImageToAdd( a_nWordId, a_Image.aWords );
wordImage.uEmphasis |= a_Record.uEmphasis;
if (a_Record.uEmphasis == 0 )
wordImage.uFreq = a_Record.aPositions.length ;
for ( var strPosition in a_Record.aPositions )
{
var tileImage = this.getTileImageToAdd( a_Record.aPositions[strPosition],
a_Image.aTiles );
tileImage.aWords[tileImage.aWords.length] = new HuginImageTileWord( a_nWordId, 0 /*nWordShape*/ );
}
}
this.unpackTopicRecord = function( a_strRecord )
{
var aShapes = a_strRecord.split( ":" );
if ( aShapes.length == 0 )
return null;
var record = new Object();
record.uEmphasis = parseInt( aS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -