劃字分詞:統計字數的思路

分詞是一項挺有難度技術的工作,或者說是門“體力活”。箇中意味很難三言兩語道盡。如果想減少重複體力勞動,把它做成腦力勞動,精準度是個糾結的問題;而若想無限接近百分百的準確度,那麼除了耗費一些腦力,大量重複體力勞動是少不了的。進而想更加全面的思考問題時,兩者勞力皆不少。

假設:

sentence = "我去上學了。"

很明顯,sentence是一句5個字詞的話(中文/漢語),包含標點符號在內是6個字符。統計字數比較簡單直接使用簡短函數。

words = len(sentence)

省略標點符號

PUNCTUATION_MARKS = [",", "。", "!", ":"]#此例省略部分標點符號
punctuations = 0
for mark in PUNCTUATION_MARKS:
    if mark in sentence:
        punctuations = punctuations + 1

if punctuations > 0:
    words = words - punctuations

這是中文句子的劃法,看起來簡單,就是字符數。那英語的怎麼樣?

sentence = "I'm going to school"

這裏可以看出英文是以空格和標點符號爲字詞分隔符。也即是說,此例中可以這樣分詞:先用空格符劃分基本字詞組

components = sentence.split()

根據標點符號再次分詞。

for component in components:
    #遍歷標點符號是否存在句子的字詞組中
    for mark in PUNCTUATION_MARKS:
        #如果存在,則繼續分詞
        if mark in component:
           #使用標點符號mark進行再分詞
           sub_components = component.split(mark)
           #遍歷再分詞組中確認是否包含標點和字詞的組合
           for sub_component in sub_components:
               #若非空字符,則爲合法字詞
               if len(sub_component) > 0:
                  words = words + 1

到這裏,就顯得有點小複雜。然而接下來更復雜的是包含數字的句子。

sentence = "我有10支筆"

如果仍將字符數等價於句子的字數,那就很有問題。從上面簡單的比較下來,我們知道像中文一樣以筆畫組合爲字體的文字,在分詞方面,與像英文以字母符號組合爲字體的語言文字相比,是互有優劣勢的,方法是不盡相同的。英文可以將一個數字組合作爲字詞,不加以特別區分,也可以輕易區分。而中文句子中的數字,區分與不區分則需要的工作量相差略大。

不包含數字的統計

for component in sentence:
    if component in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
       words = words - 1

包含數字的統計

relative = False
for component in sentence:
    if component in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
       if relative is False:
          relative = True
       else:
          words = words - 1
    else:
       relative = False

這只是一些簡單腦力、“懶人式”的分詞統計字數。當然精確度不能達到百分之百。追求高精度的應該使用字典的字詞識別。而字典本身是一項耗體力的重複勞動工作。這裏就不多敘說。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章