分词高棉语的可行解决方案?
Posted
技术标签:
【中文标题】分词高棉语的可行解决方案?【英文标题】:A Viable Solution for Word Splitting Khmer? 【发布时间】:2011-06-19 04:44:25 【问题描述】:我正在研究一种解决方案,将高棉(柬埔寨语)的长行拆分为单个单词(UTF-8 格式)。高棉语不使用单词之间的空格。有一些解决方案,但还远远不够(here 和 here),而且这些项目已经被搁置了。
这是一个需要拆分的高棉示例行(它们可能比这更长):
ចូរចូរសរសើរដល់ទ្រង់ដែលទ្រង់បានប្រទានការទាំងអស់នោះរូបអ្នកដោយព្រោះអង្គអង្គ
创建一个分割高棉语单词的可行解决方案的目标是双重的:它将鼓励那些使用高棉传统(非 Unicode)字体的人转换为 Unicode(这有很多好处),并且它将启用传统高棉字体导入 Unicode 以便快速与拼写检查器一起使用(而不是手动检查和拆分单词,这对于大型文档可能需要很长时间)。
我不需要 100% 的准确率,但速度很重要(尤其是因为需要拆分成高棉语单词的行可能会很长)。 我愿意接受建议,但目前我有大量正确拆分的高棉语词库(带有不间断空格),并且我创建了一个单词概率字典文件(frequency.csv)用作字典分词器。
我发现了这个使用Viterbi algorithm 的python 代码here,据说它运行得很快。
import re from itertools import groupby def viterbi_segment(text): probs, lasts = [1.0], [0] for i in range(1, len(text) + 1): prob_k, k = max((probs[j] * word_prob(text[j:i]), j) for j in range(max(0, i - max_word_length), i)) probs.append(prob_k) lasts.append(k) words = [] i = len(text) while 0 < i: words.append(text[lasts[i]:i]) i = lasts[i] words.reverse() return words, probs[-1] def word_prob(word): return dictionary.get(word, 0) / total def words(text): return re.findall('[a-z]+', text.lower()) dictionary = dict((w, len(list(ws))) for w, ws in groupby(sorted(words(open('big.txt').read())))) max_word_length = max(map(len, dictionary)) total = float(sum(dictionary.values()))
我还尝试使用此页面作者的源 java 代码:Text segmentation: dictionary-based word splitting,但运行速度太慢,无法使用(因为我的单词概率字典有超过 10 万个术语...)。
这是来自Detect most likely words from text without spaces / combined words的python中的另一个选项:
WORD_FREQUENCIES = 'file': 0.00123, 'files': 0.00124, 'save': 0.002, 'ave': 0.00001, 'as': 0.00555 def split_text(text, word_frequencies, cache): if text in cache: return cache[text] if not text: return 1, [] best_freq, best_split = 0, [] for i in xrange(1, len(text) + 1): word, remainder = text[:i], text[i:] freq = word_frequencies.get(word, None) if freq: remainder_freq, remainder = split_text( remainder, word_frequencies, cache) freq *= remainder_freq if freq > best_freq: best_freq = freq best_split = [word] + remainder cache[text] = (best_freq, best_split) return cache[text] print split_text('filesaveas', WORD_FREQUENCIES, ) --> (1.3653e-08, ['file', 'save', 'as'])
我是 python 的新手,我对所有真正的编程(网站之外)都很陌生,所以请多多包涵。有没有人有任何他们认为行之有效的选择?
【问题讨论】:
***.com/questions/11447859/…***.com/questions/11447859/… 上 Python 和 Ruby 中的其他实现 【参考方案1】:ICU 库(具有 Python 和 Java 绑定)有一个可用于此目的的 DictionaryBasedBreakIterator 类。
【讨论】:
@Lennart 谢谢 - 是的,我看过 ICU 库 DictionaryBasedBreakIterator 类 - 但由于我的编程经验非常有限,我无法用它做任何事情。我看到这里有一些示例:source.icu-project.org/repos/icu/icu/trunk/source/samples/break 但是您知道任何可以让我入门的 Python 和 Java 示例吗(有时我可以编辑脚本,如果做得足够多)?或者那里有一些我遗漏的例子...... @Nathan:是的,ICU Python 绑定没有任何真正的文档,这很遗憾。不,我不知道任何例子,对不起。如果你有字典,我可以试试看能不能弄明白。 这是我目前掌握的频率词典。它不是很大,但它是一个开始:sbbic.org/Khmer-Corpus-Work.zip(我还包含了一个高棉示例 txt 文件 - 全部采用 UTF-8)任何你愿意提供帮助的方式都会很棒。感谢您花时间研究它。 泰语和高棉语密切相关,既然 DictionaryBasedBreakIterator 类是为泰语制作的,也许有一种方法可以从泰语源中获取并为高棉语做一些更改? @Nathan 我们努力提供最佳解决方案。我认为ICU的用户是最好的判断方式。我看到你在 icu-support 列表中的帖子,ICU 的休息数据也来自 CLDR,所以你可能应该在那里提交一张票 cldr.unicode.org - 而且 python 绑定(据我了解)意味着与 ICU 一起使用自己的文档。【参考方案2】:带有示例filesaveas
的python 似乎递归整个输入字符串(for i in xrange(1, len(text) + 1)
),一路将最佳结果填充到cache
;在每个潜在单词处,它然后开始查看下一个单词(依次查看之后的单词,依此类推),如果第二个单词没有'看起来不太好,它不会保存那个特定的。 感觉类似于 O(N!) 运行时间,其中 N 是输入字符串的长度。
超级聪明,但除了简单的任务外,其他任何事情都可能很糟糕。你听过的最长的高棉词是什么?我希望
也许如果您一次将输入输入该示例 20 个字符,您可以将运行时间降低到接近合理的水平。输入前 20 个字符,去掉第一个单词,然后输入剩余的输入。如果你重复使用缓存,它可能会做一些愚蠢的事情,比如在途中存储部分单词。
在完全不同的情况下,有多少个高棉语单词是由两个或多个合法高棉语单词连接而成的? (类似于“penknife”或“basketball”)如果不是太多,创建一组字典可能是有意义的,按单词长度分隔,从单词映射到使用概率。
比如说,最长的高棉词是 14 个字符长;将 14 个字符输入到len14
字典中,存储概率。将 13 个字符输入len13
,存储概率。输入 12 个字符......一直到 1 到 len1
。然后选择概率最高的解释,保存单词,去掉那么多字符,然后再试一次。
所以对于像“I”和“Image”这样的输入,它不会严重失败,也许更长的输入应该有自动膨胀的概率?
感谢这个有趣的问题;)我不知道这样的语言,很酷。
【讨论】:
感谢您的输入 - 是的,高棉语中有很多串联的单词,但好的是我们可以在大多数情况下忽略它们(因为两者都是合法的,并且没有任何可见的空格)。我可能在这里咬得比我能咀嚼的还多,但很高兴知道 python 示例不能很好地处理一堆字符 - 尽管一次处理 20 个字符是个好主意...【参考方案3】:我认为这是个好主意。
我建议你,当你有一些经验时,你添加一些规则,可以非常具体,例如,取决于之前的单词,取决于之后的单词,取决于周围的单词,取决于单词的序列在当前单词之前,仅列举最常用的单词。您可以在文件 data/contextualrulefile 中找到 gposttl.sf.net 项目中的一组规则,这是一个 pos 标记项目。
规则应该在统计评估完成后使用,它们进行一些微调,可以显着提高准确性。
【讨论】:
以上是关于分词高棉语的可行解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
亚美尼亚语和高棉语字符扭曲了 React Native / iOS 中的垂直文本对齐方式
Libreoffice:如何使用高棉 Unicode 在命令行中将 .xlsx 转换为 .pdf 格式?