分詞是一項挺有難度技術的工作,或者說是門“體力活”。箇中意味很難三言兩語道盡。如果想減少重複體力勞動,把它做成腦力勞動,精準度是個糾結的問題;而若想無限接近百分百的準確度,那麼除了耗費一些腦力,大量重複體力勞動是少不了的。進而想更加全面的思考問題時,兩者勞力皆不少。
假設:
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
這只是一些簡單腦力、“懶人式”的分詞統計字數。當然精確度不能達到百分之百。追求高精度的應該使用字典的字詞識別。而字典本身是一項耗體力的重複勞動工作。這裏就不多敘說。