1

UITextView任意の長さのテキスト (最大 10000 文字)を取得しました。このテキストを解析し、すべてのキーワードを抽出し、最も頻繁に使用される単語を一番上に、次の単語を下に、というように使用頻度別にリストする必要があります。操作が完了した後、モーダル UITableView を提示する可能性が高くなります。

これを行うための効率的で便利な方法を考えています。[空白、句読点など] の形式の区切り記号を使用して、文字列を区切ることができます。これにより、文字シーケンスの配列が得られます。各 add シーケンスをNSMutableDictionaryキーとして追加し、その単語の別のインスタンスが表示されたら、そのカウントをインクリメントできます。ただし、これにより 300 ~ 400 語のリストが生成される可能性があり、ほとんどの頻度は 1 です。

私が説明しているロジックを実装する良い方法はありますか? 配列をアルファベット順に並べ替えて、ある種の「ファジー」ロジックの一致を試みる必要がありますか? この種の作業を実行できる NSDataDetector または NSString メソッドはありますか?

追加の質問: a、at、to、for などを抽出して、キーワード リストに含めないようにするにはどうすればよいですか?

すでにこのタスクを達成しているサンプル プロジェクトを見ていただければ幸いです。

ありがとうございました!

4

3 に答える 3

2

CFStringTokenizer単語の境界を取得するために使用できます。カウントには、NSMutableDictionary提案したように、またはを使用できますがNSCountedSet、これは少し効率的かもしれません。

頻度が1(またはその他のしきい値)の単語に興味がない場合は、すべての単語をカウントした後でそれらを除外する必要があります。

特定の単語(a、the、for ...)を無視するには、テキストの言語に固有の単語リストが必要です。ストップワードに関するウィキペディアの記事には、このCSVファイルなどのリンクがいくつか含まれています。

于 2012-04-22T14:54:24.167 に答える
2

これを行うには多くのアプローチがあります。

すべてのキーワードを配列 (または他のコレクション オブジェクト) に追加し、それを参照/反復して、これらのキーワードとこれらのキーワードのみを検索するようにする必要があります (また、a、at、to、for、の出現のチェックを回避します)。等。)

NSArray *keywords = [ add your keywords ];

NSString *textToSearchThrough = @" your text ";  // or load your text File here

- loop control statement here (like maybe fast enumerate), and inside this loop:
NSRange range = [textToCheckThrough rangeOfString:keywords[currentKeyword] 
                              options:NSCaseInsensitiveSearch];
if(range.location != NSNotFound) {
   // meaning, you did find it 
   // add it to a resultsArray, add 1 to this keyword's occurrenceCounter (which you must also declare and keep track of)
   // etc.
}

次に、結果配列をループし、キーワードごとの出現回数をチェックし、出現回数が < minOccurrenceCount である人をパージし、残りを最高から最低に並べ替えます。

于 2012-04-22T15:11:42.743 に答える
0

私はで行くことになったCFStringTokenizer。以下のブリッジキャストが正しいかどうかはわかりませんが、機能しているようです

-(void)listAllKeywordsInString:(NSString*)text
    {
        if(text!=nil)
        {
            NSMutableDictionary* keywordsDictionary = [[NSMutableDictionary alloc] initWithCapacity:1024];
            NSString* key = nil;
            NSLog(@"%@",text);

             NSLog(@"Started parsing: %@",[[NSDate date] description]);

            CFStringRef string =(__bridge CFStringRef)text; // Get string from somewhere

        CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault,  (__bridge_retained CFStringRef) text, CFRangeMake (0,CFStringGetLength((__bridge_retained CFStringRef)text)), kCFStringTokenizerUnitWord, CFLocaleCopyCurrent());

            unsigned tokensFound = 0; // or the desired number of tokens

            CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;

            while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)) ) {
                CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
                CFStringRef tokenValue = CFStringCreateWithSubstring(kCFAllocatorDefault, string, tokenRange);

                // This is the found word
                key =(__bridge NSString*)tokenValue;

                //increment its count
                NSNumber* count = [keywordsDictionary objectForKey:key];
                if(count!=nil)
                {
                     [keywordsDictionary setValue:[NSNumber numberWithInt:1] forKey:key];
                }else {
                    [keywordsDictionary setValue:[NSNumber numberWithInt:count.intValue+1] forKey:key];
                }



                CFRelease(tokenValue);

                ++tokensFound;
            }
            NSLog(@"Ended parsing. tokens Found: %d, %@",tokensFound,[[NSDate date] description]);
            NSLog(@"%@",[keywordsDictionary description]);
            // Clean up
            CFRelease(tokenizer);

        }


    }
于 2012-04-23T11:41:05.850 に答える