我只是学习Swift并玩CFStringTokenizer,我注意到当字符串被标记化时,标点符号和符号被忽略。我对Tokenization这个主题并不太熟悉,但我想更好地理解tokenizer如何工作,如果我需要做更复杂的标记化,需要我找到诸如"!&#34之类的东西;或" +"。任何帮助将不胜感激。
所以我的问题是:
这是我一直在使用的游乐场:
import Cocoa
var str = "I have 2 pairs of pants + five shirts, but threw out 3 socks with holes! 2+5-3"
var tokens: [(token: String, range: CFRange, type: CFStringTokenizerTokenType)] = []
var strLen = countElements(str)
var strRng = CFRangeMake(0, strLen)
var flag = UInt(kCFStringTokenizerUnitWord)
var locale = CFLocaleCopyCurrent()
var tknizr = CFStringTokenizerCreate( kCFAllocatorDefault, str, strRng, flag, locale)
var tknType = CFStringTokenizerAdvanceToNextToken(tknizr)
do {
var tRng = CFStringTokenizerGetCurrentTokenRange(tknizr)
var from = advance(str.startIndex, tRng.location)
var to = advance(from, tRng.length)
var substrRng = Range<String.Index>(start: from, end: to)
var substr = str.substringWithRange(substrRng)
println("String: \(substr)")
println("Token Type: \(tknType.rawValue)\n")
tokens += [(substr, tRng, tknType)]
tknType = CFStringTokenizerAdvanceToNextToken(tknizr)
} while tknType.rawValue != 0
- UPDATE -
我添加了objective-c标签,因为这也适用于obj-c。
答案 0 :(得分:5)
好的,经过多次回顾,我找到了一些答案。
忽略符号和标点符号作为标记的预期行为吗?
是的,kCFStringTokenizerUnitWord
只会将单词作为标记提取出来,所以这是预期的行为。我使用了错误的CFStringTokenizer选项。
有没有办法让CFStringTokenizer将符号视为一个标记或将一个符号作为一个标记的一部分?即“+”,“ - 3”或“世界!”
我本应该使用kCFStringTokenizerUnitWordBoundary
代替。它将符号捕获为标记。这样做的缺点是空间也被捕获为标记,但很容易被一些额外的逻辑忽略。
有人还可以解释CFStringTokenizerTokenType如何用于测试令牌类型吗?
&lt; shakeshead&gt;感觉就像这里的新手一样,它们是位掩码,而不是字面值。&lt; / shakeshead&gt;因此,我使用逻辑运算符测试原始值是错误的方法。按位运算符是测试令牌类型的正确方法。