首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Swift 3.0中从字符串中提取单词(英语)和名称?

如何在Swift 3.0中从字符串中提取单词(英语)和名称?
EN

Stack Overflow用户
提问于 2016-12-22 23:05:02
回答 1查看 1.4K关注 0票数 2

我使用的是一个图像处理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获奖者”

//我需要摘录“莎伦·哈泽尔伍德·高德雷伯在火神逼下的强大三部曲”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-24 17:29:13

我把这门课拼凑在一起,这是一个真实和伪代码的混合体。我会为名字和姓氏创建一个单例类。有关详细信息,请参阅代码中的注释。这不是全部,但它应该能解决你的大部分问题。

Update使用开关语句调整了cleanUpString方法。

更新2添加了这个来处理UITextChecker没有.

代码语言:javascript
运行
复制
return UIReferenceLibraryViewController.dictionaryHasDefinition(forTerm: self)

无论您从何处获取OCR文本,您都可以这样使用它:

代码语言:javascript
运行
复制
let stringParser = StringParser()
let cleanedUpText = stringParser.cleanUpString(yourOCRText)

这是一堂课:

代码语言:javascript
运行
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41292904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档