iPhone SDK: Как создать приложение в стиле переводчика

#iphone #sql #database #switch-statement

#iPhone #sql #База данных #switch-инструкция

Вопрос:

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

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

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

Спасибо

Ответ №1:

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

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

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

С SQLite довольно легко работать, вы можете просто начать с большого файла Excel, затем с помощью какого-нибудь sqlite manager (я использую плагин Firefox) импортировать его в файл .sqlite и добавить в свой проект. Вы думали о том, как бы вы справились с «word not found»?

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

 -(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], amp;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, amp;resultStatement, nil))!=SQLITE_OK){
                NSLog(@"Error getting result, maybe word not foundn");
                        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:amp;error];
    if (!success) {
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}
  

Комментарии:

1. Хорошо, хорошо, я пытался реализовать этот код в течение часа или около того, и на стороне журнала я продолжаю получать сообщение «Ошибка при получении результата, возможно, word не найден», я могу только думать, что моя проблема связана с фактическим файлом базы данных, который я создал, что я могу здесь устранить?

2. вы изменили ‘dictionary’ на фактическое имя таблицы, которое вы использовали в своем файле sqlite? и ‘plain’ вместо правильного имени столбца, который вы использовали?

3. Я понял, что только потому, что мы разбили строку на пробелы, они все еще THERE…so вместо поиска «word» вы, вероятно, искали «word» или «word»… Я добавил обрезку в приведенный выше код: [[words objectAtIndex:i] stringByTrimmingCharactersInSet:whitespaceCharacterSet]

4. Ну, если я попробовал только одно слово без пробелов, разве оно не должно все еще работать? Поскольку это то, что я пытался, я даже не добрался до нескольких слов, а также компилятор жалуется на набор пробелов как на необъявленный

5. да, это должно было сработать с одним словом. вот откуда у меня этот набор: developer.apple.com/library/mac/documentation/Cocoa/Reference / … :

Ответ №2:

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

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

Комментарии:

1. Да, возможно, для реальных языков, но для моего приложения это подходит, поскольку это больше похоже на другой способ формулировки того же слова.