我使用的是一个图像处理API,它读取图像上的文本,从返回的字符串数据中,我需要提取英语语言或字典中的单词以及普通的名字和姓氏。换句话说,我得到了在字符串中需要的文本,但也得到了需要过滤的结果(非单词)中的一些垃圾。这里最好的方法是什么?我已经调查过NSLinguisticTagger了,但是我做的事情并不是百分之百的,还有其他的建议吗?
REGEX能帮我吗?我不知道如何为只匹配单词的模式形成语法?
下面是两个示例字符串的示例,我试图从其中提取单词/名称:
(1) "PUMPER im CasSICI 1111 Cassu Andrew Webster PUMPE im CasSICI 1111 Cassu Andrew Webster“
//我需要摘录:“与安德鲁·韦伯斯特合作”
(2)“莎伦M DRAPER000k在强大的黑泽尔伍德高trilogyFORGEDBY FIRESWINNER沙龙M Draper000k在强大的黑泽尔伍德高三部曲伪造火S获奖者”
//我需要摘录“莎伦·哈泽尔伍德·高德雷伯在火神逼下的强大三部曲”
发布于 2016-12-24 17:29:13
我把这门课拼凑在一起,这是一个真实和伪代码的混合体。我会为名字和姓氏创建一个单例类。有关详细信息,请参阅代码中的注释。这不是全部,但它应该能解决你的大部分问题。
Update使用开关语句调整了cleanUpString方法。
更新2添加了这个来处理UITextChecker没有.
return UIReferenceLibraryViewController.dictionaryHasDefinition(forTerm: self)无论您从何处获取OCR文本,您都可以这样使用它:
let stringParser = StringParser()
let cleanedUpText = stringParser.cleanUpString(yourOCRText)这是一堂课:
import UIKit // need this so UITextChecker will work
import Foundation
class StringParser: NSObject {
// TODO: You'll need to create a singleton class for your first and last names
// https://krakendev.io/blog/the-right-way-to-write-a-singleton
func cleanUpString(_ inputString: String) -> String {
// chuck stuff separated by a space into an array as an invdividual string
let inputStringArray = inputString.characters.split(separator: " ").map(String.init)
var outputArray = [String]()
for word in inputStringArray {
// Switch to check if word satisfies any of the desired conditions...if so, chuck in outputArray
switch word {
case _ where word.isRealWord():
outputArray.append(word)
break
case _ where word.isFirstName():
outputArray.append(word.capitalized)
break
case _ where word.isLastName():
outputArray.append(word.capitalized)
break
default:
break
}
}
// reassemble the cleaned up words into an output array and return it as a single string
return outputArray.joined(separator: " ")
}
}
extension String {
func isFirstName() -> Bool {
let firstNameArray = ["Andrew", "Sharon"] // FIXME: this should be your singleton
return firstNameArray.contains(self.capitalized)
}
func isLastName() -> Bool {
let lastNameArray = ["Webster", "Hazelwood"] // FIXME: this should be your singleton
return lastNameArray.contains(self.capitalized)
}
func isRealWord() -> Bool {
// adapted from https://www.hackingwithswift.com/example-code/uikit/how-to-check-a-string-is-spelled-correctly-using-uitextchecker
let checker = UITextChecker()
let range = NSRange(location: 0, length: self.utf16.count)
let misspelledRange = checker.rangeOfMisspelledWord(in: self, range: range, startingAt: 0, wrap: false, language: "en")
if misspelledRange.location == NSNotFound {
// cleans up what UITextChecker misses
return UIReferenceLibraryViewController.dictionaryHasDefinition(forTerm: self) // returns yes if there's a definition for it
}
return false
}
}https://stackoverflow.com/questions/41292904
复制相似问题