如何使用中文和日文的StringTokenizer?

时间:2011-11-26 19:00:50

标签: objective-c iphone tokenize cjk text-segmentation

我正在使用代码here将文本拆分为单个单词,而且除了日语和中文之外,它对我尝试过的所有语言都很有效。

有没有办法可以调整代码以正确地标记日语和中文?文档说支持这些语言,但它似乎并没有在适当的地方打破单词。例如,当它标记为“新しい”时,它将它分成两个单词“新し”和“い”当它应该是一个(我不会说日语,所以我不知道这是否真的是正确的,但是我已经说过那些应该都是一个字的样本。其他时候它会跳过单词。

我尝试使用kCFStringTokenizerUnitWordBoundary创建中文和日文语言环境。结果有所改善,但对于我正在做的事情仍然不够好(添加词汇表单词的超链接)。

我知道其他一些可用的标记器,但如果我能坚持使用核心基础,我宁愿避开它们。

[更新] 我们最终使用mecab与日语的特定用户词典已有一段时间了,现在已经转移到在服务器端执行所有这些操作。它可能并不完美,但我们在所有平台上都有一致的结果。

2 个答案:

答案 0 :(得分:3)

如果您知道自己正在分析特定语言,则应使用正确的CFStringTokenzier(或至少来自CFLocale的猜测)创建CFStringTokenizerCopyBestStringLanguage并使用kCFStringTokenizerUnitWordBoundary

不幸的是,中文和日文文本的完美分词仍然是一个开放而复杂的问题,因此您使用的任何分段库都会有一些失败。对于日语,CFStringTokenizer在内部使用MeCab库和ICU's Boundary Analysis(仅在使用kCFStringTokenizerUnitWordBoundary时,这就是为什么你在没有它的情况下与“新しい”进行有趣的休息)

答案 1 :(得分:2)

另请参阅NSLinguisticTagger。 但是它本身不会给你更多。

说实话,这两种语言(以及其他一些语言)很难准确地以编程方式进行标记。

您还应该在LSM上看到WWDC视频。潜在语义映射。它们涵盖了词干和引理的主题。这是更准确地确定如何有意义地进行标记化的艺术和科学。

你想做的事情很难。单独查找单词边界并不能为您提供足够的上下文来传达准确的含义。它需要查看上下文,并识别不应该被破坏的习语和短语。 (更不用说语法形式)

之后再看一下可用的库,然后找一本关于Python NLTK的书,了解你真正需要了解的NLP,了解你真正想要追求的程度。

较大的文本体本身会产生更好的结果。没有考虑错别字和错误的语法。在分析隐式上下文中驱动逻辑所需的大部分上下文不是直接写成单词。你可以建立规则并训练这件事。

日本人是一个特别艰难的日本人,在日本以外开发的许多图书馆并不接近。您需要一些语言知识才能知道分析是否有效。即使是日本本土人也很难在没有适当背景的情况下进行自然分析。常见的情况是语言呈现两个相互可理解的正确单词边界。

举一个类比,这就像做了很多展望未来并在正则表达式中看后面。