我正在使用enumerateTags
类的NSLinguisticTagger
函数进行一些字符串分析。一切正常,除了以下一种:我永远无法确定枚举何时结束。
let originalText = "Some text."
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation]
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage:"en")
let tagger = NSLinguisticTagger(tagSchemes: schemes, options:Int(options.rawValue))
tagger.string = originalText
tagger.enumerateTags(in: NSMakeRange(0, (originalText as NSString).length),
scheme: NSLinguisticTagScheme.tokenType, options: options) { (tag, tokenRange, _, stop) in
// I do my job here
// I need to callback when the enumeration is over
if tokenRange.upperBound == originalText.count {
// Callback
}
})
当原始字符串以字母结尾时,此结束检查工作正常,但如上例所示,如果它以标点符号或空格结尾,则永远不会调用该回调。
我在Google上搜索了很多,但是我找不到这种广泛的任务的任何解决方案:如何确定枚举何时结束?
答案 0 :(得分:0)
您要删除标点符号和空格,因此如果文本的确以空格或标点结尾,则条件if tokenRange.upperBound == originalText.count
永远不会为真。
您可以使用此字符串代替语言标记器中的originalText
:
let newText = originalText
.trimmingCharacters(in: .whitespacesAndNewlines)
.trimmingCharacters(in: .punctuationCharacters)
您的代码如下:
let originalText = "Some text "
let newText = originalText
.trimmingCharacters(in: .whitespacesAndNewlines)
.trimmingCharacters(in: .punctuationCharacters)
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation]
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage:"en")
let tagger = NSLinguisticTagger(tagSchemes: schemes, options:Int(options.rawValue))
tagger.string = originalText
tagger.enumerateTags(in: NSMakeRange(0, (newText as NSString).length), scheme: .tokenType, options: options, using: {(tag, tokenRange, _, stop) in
if tokenRange.upperBound == newText.count {
print("reached the end")
}
})
回调在代码中以in
开头,而不是在if条件之内。
答案 1 :(得分:0)
enumerateTags(in:unit:scheme:options:using:)
同步枚举字符串的给定范围,并且
调用每个标签的闭包。函数返回时,枚举已完成。
(据我所知)异步方法都是记录的,
以@escaping
闭包作为参数,并允许指定某种完成处理程序(或完成委托方法)。
答案 2 :(得分:0)
这是我的解决方法
df[['First_Name','Last_Name']]=df.pop('Names').str.split(" ",expand=True)
print(df)
Email First_Name Last_Name
0 aa@bb.com aa bb
1 bb@cc.com bb cc
2 cc@dd.com cc dd