Алгоритм нечеткого совпадения для Swift - PullRequest
2 голосов
/ 03 апреля 2020

Я работаю над приложением, которое использует OCR для получения текста с изображения и выполняет поиск текста в базе данных MYSQL, содержащей ~ 10000 записей. В большинстве случаев текст, отсканированный с изображения, не является точным (пропущенные или неправильно введенные слова), поэтому я использую Fuse для нечеткого сопоставления ... он хорошо работает с небольшими списками, но работает очень медленно - это занимает 5 минут, чтобы сканировать до 10K записей и не настолько точен (около 50% совпадений).

Кто-нибудь может порекомендовать библиотеку или метод для того, чтобы взять неправильно введенный или неправильно упорядоченный текст из сканирования OCR и сопоставить его с правильной базой данных запись?

Вот код, который я использую:

// Setting variables
private var allBooks = [Book]()
let fuse = Fuse()
var bookNames = [String]()

var OCRArray : [String] = []

// Get all books from database
    sqlConfig.configureMySQL()
    BooksProvider().loadBooks { books in
        self.allBooks = books
    }

// Put list of books in string array in order for fuse search to work
    for object in allBooks {
        let strName = object.name ?? ""
        bookNames.append(strName)
    }

// Function that iterates thru each line of OCR scan that is stored in OCRArray
// This takes several 5+ to complete
func fuseMatch() {
    for x in 0..<OCRArray.count {

        var results = fuse.search(OCRArray[x], in: bookNames)

        var fuseWine:String

        if results.first != nil {
            fuseMatch = bookNames[results[0].index]

        } else {
            fuseMatch = "Not found."
        }
        print(x, " | ", OCRArray[x], " | ", fuseMatch)
    }
}
...