分裂高棉语的可行解决方案?
我正在研究将高棉语(柬埔寨语)的长行分成单个单词(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()))
我也尝试使用本页作者的源代码:文本分割:基于字典的单词分割,但它运行得太慢而无法使用(因为我的单词概率字典有超过100k的术语......)。
以下是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来说,我是一个新手,我对所有真正的编程(网站之外)都很陌生,所以请耐心等待。有没有人有任何他们认为会运作良好的选择?
没有找到相关结果
已邀请:
3 个回复
翰冒绢县
期差骇蓟
的python似乎递归整个输入字符串(
),沿途将最佳结果填入
;在每个潜在的单词中,它然后开始查看下一个单词(后面将依次查看单词,依此类推),如果第二个单词看起来不太好,则不会保存那个单词。感觉就像O(N!)运行时,其中N是输入字符串的长度。 超级聪明,但除了简单的任务外,可能很恐怖。你有多长的高棉词是什么?我希望&lt; 20个字符。 也许如果您一次向该示例中输入20个字符的输入,您可以将运行时间保持在合理的范围内。输入前20个字符,取出第一个字,然后输入剩余的输入。如果您重新使用缓存,它可能会做一些愚蠢的事情,就像沿途存储部分单词一样。 在一个完全不同的方面,通过连接两个或更多合法的高棉语,形成了多少高棉语? (类似于'小刀'或'篮球')如果不是太多,创建一组字典,按字长分隔,从单词到使用概率的映射可能是有意义的。 比如说,最长的高棉语是14个字符长;输入14个字符的输入到
字典,存储概率。将13个字符输入
,存储概率。输入12个字符......一直到1进入
。然后选择具有最高概率的解释,保存单词,剥去那么多字符,然后再试一次。 因此,对于像“我”和“图像”这样的输入,它不会失败,可能更长的输入应该有自动膨胀的概率? 感谢有趣的问题;)我不知道这样的任何语言,非常酷。
亲奋漏