我正在研究將長長的高棉語(柬埔寨語)拆分爲單個單詞(UTF-8)的解決方案。高棉語不會在單詞之間使用空格。這裏有一些解決方案,但它們遠遠不夠(here和here),而這些項目已經落後了。分詞高棉的可行解決方案?
這裏是紅色的採樣線需要被分割(它們可以比這個更長):
ចូរសរសើរដល់ទ្រង់ដែលទ្រង់បានប្រទានការទាំងអស់នោះមកដល់រូបអ្នកដោយព្រោះអង្គព្រះយេស៊ូវហើយដែលអ្នកមិនអាចរកការទាំងអស់នោះដោយសារការប្រព្រឹត្តរបស់អ្នកឡើយ。
創建拆分高棉話可行的解決方案的目標是雙重的:它會鼓勵那些誰使用高棉傳統的(非Unicode)的字體,在轉換爲Unicode(它有很多好處),它將使傳統的高棉字體被導入到Unicode中,以便與拼寫檢查器一起使用(而不是手動檢查和分割帶有大型文檔的文字可能需要很長時間的文字)。
我不需要100%的準確性,但速度很重要(尤其是因爲需要拆分成高棉語的線路可能會很長)。 我很樂意提供建議,但目前我有一個高分辨率的高棉語語料庫,它可以正確分割(使用非破壞性空間),並且我創建了一個單詞概率詞典文件(frequency.csv)用作詞典詞分離器。
我發現這個Python代碼here,它使用Viterbi algorithm,它應該運行得很快。
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'])
我是一個newbee當談到蟒蛇,我真正的新所有真正的編程(網站外),所以請多多包涵。有沒有人有任何他們認爲會運作良好的選擇?
@Lennart謝謝 - 是的,我已經看過ICU library DictionaryBasedBreakIterator類 - 但是因爲我在編程經驗上非常有限,所以我無法對它做任何事情。我看到這裏有一些例子:http://source.icu-project.org/repos/icu/icu/trunk/source/samples/break/但是你知道任何Python和Java的例子,會讓我開始(有時我可以編輯一個腳本,如果足夠了)?還是有一些例子,我錯過了... – Nathan 2011-02-01 11:51:11
@Nathan:是的,ICU的Python綁定沒有任何真正的文檔,這是一個恥辱。不,我不知道任何例子,對不起。如果你有一本字典,我可以試着看看能否找出答案。 – 2011-02-01 11:54:59