3

NSDataDetectorを使用して奇妙な結果が得られ、それがどのように機能するかについての洞察を探しています。

内部データベースと照合していますか、それとも文字列内の個別のフィールドを検出するために分離アルゴリズムを使用していますか?

現在、私は次のコードを使用して住所のフィールドを検出しています。

NSDataDetector *address = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:nil];
NSArray* matcheslinkaa = [address  matchesInString:inputString options:0 range:NSMakeRange(0, [inputString length])];
if ([matcheslinkaa count]>0) 
{
    for (NSTextCheckingResult *match in matcheslinkaa) 
    {
        if ([match resultType] == NSTextCheckingTypeAddress) 
        {
            NSDictionary *phoneNumber = [match addressComponents];
            NSLog(@"addressComponents  %@",phoneNumber);
        }
    }
}

以下は、上記のコードを使用した、入力文字列とそれぞれの出力のサンプルセットです。

inputString = @"100 Main Street\n"  
               "Anytown, NY 12345\n"
               "USA";
// prints:
// addressComponents  {
//     City = Anytown;
//     Country = USA;
//     State = NY;
//     Street = "100 Main Street";
//     ZIP = 12345;
// }

inputString = @"A-205 Natasha Golf View\n"
               "2 Inner Ring Road\n"
               "Bangalore\n"
               "560071\n"
               "Karnataka";
// prints:
// addressComponents  {
//     City = Bangalore;
//     Street = "2 Inner Ring Road";
//     ZIP = 560071;
// }

inputString = @"A-205 Natasha Golf View\n"
               "2 Inner Ring Road\n"
               "Domlur\n"
               "Bangalore\n"
               "560071\n"
               "India";

// prints:
// addressComponents  {
//     City = Bangalore;
//     Street = "2 Inner Ring Road";
//     ZIP = 560071;
// }

inputString = @"Dak Bhavan\n"
               "Parliament Street\n"
               "NEW DELHI 110001\n"
               "INDIA";

// => `addressComponents` is empty!

ご覧のとおり、NSDataDetectorはUSアドレスを抽出するのに問題はありません。インドの住所では国名すら見つからないほど悪化しているのはなぜですか?

4

2 に答える 2

1

これを試してみませんか。

[detector enumerateMatchesInString:str
                         options:0 
                           range:NSMakeRange(0, [str length]) 
                      usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

            
                NSDictionary *phoneNumber = [result addressComponents];
                NSLog(@"addressComponents  %@",phoneNumber);
            

                      }];

それがうまくいかない場合...アドレスは次の形式である必要があります

100 Main Street
Anytown, NY 12345
USA

他の方法を試すことができます..「str」を上記の形式に変換することもできます...

または直接あなたはこれを試すことができます。

 NSArray *array = [tempAddrStr componentsSeparatedByString:@","];
        if([array count]>2)
        {
            NSString *str1 = [array objectAtIndex:[array count]-3];
            NSString *str2 = [array objectAtIndex:[array count]-2];
            str1=[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str1=[str1 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
            str2=[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str2=[str2 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];

            tempAddrStr=[NSString stringWithFormat:@"%@, %@",str1,str2];
        }
        else if([tempAddrStr length]>=140&&[array count]>1)
        {
            NSString *str1 = [array objectAtIndex:[array count]-2];
            NSString *str2 = [array objectAtIndex:[array count]-1];
            str1=[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str1=[str1 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
            str2=[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str2=[str2 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];

            tempAddrStr=[NSString stringWithFormat:@"%@, %@",str1,str2];
        }

これは、CLGeocoderによって返された特定のアドレスから州と市を取得するための私のプロジェクトのコードの一部です。

于 2012-01-04T09:32:07.360 に答える
1
于 2012-01-07T15:31:16.807 に答える