我正在研究一种解决方案,将高棉(柬埔寨语)的长行拆分为单个单词(UTF-8 格式)。高棉语不使用单词之间的空格。有一些解决方案,但它们还远远不够(这里和这里),而且这些项目已经被搁置了。
这是需要拆分的高棉示例行(它们可能比这更长):
创建一个分割高棉语单词的可行解决方案的目标是双重的:它将鼓励那些使用高棉传统(非 Unicode)字体的人转换为 Unicode(这有很多好处),并且它将允许导入传统高棉字体转换成 Unicode 以便快速与拼写检查器一起使用(而不是手动检查和拆分单词,这对于大型文档可能需要很长时间)。
我不需要 100% 的准确率,但速度很重要(特别是因为需要拆分成高棉语单词的行可能很长)。我愿意接受建议,但目前我有大量正确拆分的高棉语词库(带有不间断空格),并且我创建了一个单词概率字典文件(frequency.csv)用作字典分词器。
我在这里找到了这个使用Viterbi 算法的python 代码,据说它运行得很快。
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 代码:文本分割:基于字典的分词,但运行速度太慢而无法使用(因为我的单词概率字典有超过 100k 的术语......)。
这是 Python 中的另一个选项,来自Detect most possible words from text without spaces / combine words:
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 的新手,我对所有真正的编程(网站之外)都很陌生,所以请多多包涵。有没有人有任何他们认为会很好的选择?