iPhone SDK: как создать приложение в стиле переводчика - PullRequest
0 голосов
/ 31 мая 2011

Я пытаюсь создать приложение, которое может в основном брать текст из одного поля, введенного пользователем, и преобразовывать его в эквивалент этого текста в другое текстовое поле. Когда я говорю «эквивалент», я имею в виду другой способ формулировки того же слова, это будут мои собственные слова, и они недоступны в какой-либо другой базе данных, которая уже где-то была сделана.

Я мог бы сделать это в небольшом масштабе с чем-то вроде оператора switch для всех предоставленных возможностей, но для целого языка это имеет проблемы с практичностью.

Как бы я поступил так? Буду ли я хранить все слова и их эквиваленты в базе данных SQLite? И как бы я интегрировать это в приложение? У меня очень ограниченные знания, когда речь заходит о программировании, которое будет включать в себя целую базу данных значений, я просто привык перечислять отдельные значения и не очень осведомлен о коротких кодах, способных интегрировать множество значений. Можно ли интегрировать все значения базы данных SQL в Switch или оператор if, который мог бы разделить текстовую запись пользователя, в отдельные слова, которые он содержит, и отобразить их эквиваленты, перечисленные в базе данных?

Спасибо

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Из вашего комментария "это были бы мои собственные слова, и он недоступен в какой-либо другой базе данных, которая уже где-то уже была сделана", правильно ли считать, что ваша дословная замена является правильным подходом к тому, чего вы хотите достичь?(без отдельного языка или прецедента с тем, что правильно?)

Если это так, я думаю, вы бы сделали что-то вроде:

1) возьмите строку из поля ввода, 2) apply componentsSeparatedByString:чтобы он был разбит на массив, затем, 3) взять каждый элемент в массиве, найти его в вашей БД sqlite, вернуть эквивалентное слово и добавить его в строку (и пробел) ... 4) когдапо окончании работы с массивом выведите полученную строку в поле «output».

С SQLite довольно легко работать, вы можете просто начать с большого файла Excel, а затем с каким-нибудь менеджером sqlite (яиспользуйте плагин firefox), импортируйте его в файл .sqlite и добавьте в свой проект.Задумывались ли вы о том, как бы вы справились с «словом не найдено»?

Это непроверенный код, просто чтобы дать вам кое-что для начала:

-(void) viewWillAppear:(BOOL)animated{
[self createEditableCopyOfDatabaseIfNeeded];
}

-(sqlite3 *) getNewDBConnection{
        sqlite3 *newDBconnection;
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"];
        // Open the database. The database was prepared outside the application.
        if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) {
        NSLog(@"Database Successfully Opened"); 
        } else {
        NSLog(@"Error in opening database");
        }
        return newDBconnection; 
    }

-(void)translate{
        //take input and break into an array
        NSString *clearText = [[NSString alloc] init];
        clearText=inputBox.text;
        NSArray *words = [[NSArray alloc] init];
        words= [clearText componentsSeparatedByString:@" "];
        numOfWords=words.count;
        NSString *newText=@"";
        //open database
        sqlite3 *db = [self getNewDBConnection];
        //loop through array
        for(i=0;i<numOfWords;i++){
            sqlite3_stmt *resultStatement = nil;
            NSString *res = [NSString stringWithFormat:@"select * from dictionary where plain='%@'",[[words objectAtIndex:i] stringByTrimmingCharactersInSet:whitespaceCharacterSet]];
            if((sqlite3_prepare_v2(db, [res UTF8String], -1, &resultStatement, nil))!=SQLITE_OK){
                NSLog(@"Error getting result, maybe word not found\n");
                        NSLog(@"error: %s", sqlite3_errmsg(db));
            }
            else{
                if(sqlite3_step(resultStatement)==SQLITE_ROW){
                    //in the line below, 1 is the column number of the replacement word
                    NSString *add = [[NSString alloc] initWithUTF8String: (char*)sqlite3_column_text(resultStatement,1)]
                    newText=[newText stringByAppendingString:add];
                    [add release];
                }
            }
            sqlite3_finalize(resultStatement);
        }
        //output result
        outputBox.text=newText;
        sqlite3_close(db);
    }

-(void)createEditableCopyOfDatabaseIfNeeded {

    // First, test for existence.
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];
    if (success) return;
    // The writable database does not exist, so copy the default to the appropriate location.
    //NSLog(@"Creating editable copy of database");
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}
2 голосов
/ 31 мая 2011

Машинный перевод - чрезвычайно сложная проблема, и не может быть решена простым внедрением пословного словарного перевода.В Википедии есть достойный обзор различных подходов, существующих в литературе;обратите внимание, однако, что ни один из них не является тривиальным для реализации.

Машинный перевод

...