查找文本块中特定单词的最大群集

时间:2009-07-17 16:21:36

标签: algorithm string text

我有一个文本块(任意长度),每当出现时都会以黄色突出显示。我想只显示400字的文本块,但我想用最突出的单词显示块。

有人知道一个好的算法吗?

我有每个突出显示的单词的字符位置,所以算法需要找到不均匀间隔整数的最密集的簇?

4 个答案:

答案 0 :(得分:6)

我不知道你怎么知道它们被突出显示但是这是一个简单的O(n)方法我会尝试。

将单词扫描成循环队列(最大容量为400),如果它们被突出显示,则递增计数器,一旦达到队列容量,将必要的单词出列,以便排列下一个单词。当您将突出显示的单词出列时,会减少计数器。跟踪你的计数器在任何时候达到的最大值以及最多400字开始的位置

不太优雅,但相当简单。

答案 1 :(得分:2)

你可以逐字移动平均值(在过去的400个单词中),同时跟踪到目前为止看到的最大值。一旦完成,您的最大值将告诉您使用哪400个单词。

答案 2 :(得分:1)

这并不是你要求的,但我在过去使用过这样的东西,同时搜索单词(charPos指的是单词的起始字符位置)。注意:'/'运算符执行整数除法,即4200/2000 = 2。

if hasKey(charPositionHashtable[charPos/2000]):
    charPositionHashtable[charPos/2000]) += 1
else:
    charPositionHashtable[charPos/2000]) = 1

搜索完成后,charPositionHashtable有一堆键/值对,其中包含2000个字符块的“索引”,以及其中找到的单词的计数。取最大值,并使用与该索引对应的块。我认为这比O(n)更好(但我没有对此做过很多分析)。

答案 3 :(得分:1)

你有突出显示的单词的标记..我认为下面是一个好的,快速的方法,因为它不需要“找到”每个单词(做循环循环)。为此,它使用从大量字符而不是单词派生的“块大小”。然后你可以“向上”或“向下”到最近的单词结尾,并且你有你的大块。

我认为,可以更好地完成在样本前面有多少突出显示的标记位于“块大小”内的方法。

string GetHighestDensityChunk(){

// {chunk size} = 400 * average word length
// {possible start positions} = 0, highlighted indicies, and (sample - {chunk size})

int position
int bestPositionSoFar = 0
int maxHighLightedCountSoFar = 0


for each position in {possible start position}
{
    highlightedCount = GetNumberOfHighlightedWithinChunkSize(position)

    if(highlightedCount > maxHighLightedCountSoFar) 
    {
        maxHighLightedCountSoFar = highlightedCount
        bestPositionSoFar = position
    }
}

// "round up" to nearest word end
// gives index of next space after end of chunk starting from current best position
{revised chunk size} = sample.indexOf(' ', startingAt = bestPositionSoFar + {chunk size}) - bestPositionSoFar

return sample.substring(bestPositionSoFar, {revised chunk size})
}   


 int GetNumberOfHighlightedWithinChunkSize(position)
{
    numberOfHighlightedInRange = 0

    // starts from current position and scans forward counting highlighted indicies that are in range
    for(int i= {possible start position}.indexOf(position); i<= {possible start position}.length; i++){
        if({possible start position}[i] < position + {chunk size}){
            numberOfHighlightedInRange++;
        } else {
            break;
        }
    }
    return numberOfHighlightedInRange;
}