您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python如何實現對中文文本分段分句”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python如何實現對中文文本分段分句”文章能幫助大家解決問題。
實現對文本的分句,大致來說主要是以中文的句號、感嘆、問號等符號進行分句。難點在于直接分句可能會造成人物說話的語句也被分開!
分段
首先讀取文本,文本讀取后整體是一個字符串,每一個段之間是空白,所以分段之間按照空白分開來即可,最后存入一個paragraph_list,注意該list的下標就是段落的順序號!其他的這里就不再多贅述!(可以查看最后的整體代碼)
分句
首先拿到上面分好的paragraph_list,循環拿到每一段,然后對每一段直接按照分句規則(正則表達式)進行分句,參考該文章
import re def cut_sent(para): para = re.sub('([。!?\?])([^”'])', r"\1\n\2", para) para = re.sub('(\.{6})([^”'])', r"\1\n\2", para) para = re.sub('(\…{2})([^”'])', r"\1\n\2", para) para = re.sub('([。!?\?][”'])([^,。!?\?])', r'\1\n\2', para) para = para.rstrip() return para.split("\n") # 這一段文字分句后應該有的結果 s = '今天天氣好啊!' \ '溫度高嗎?你好,很高興遇見你,真不錯。' \ '小明遇見小紅說:"你的衣服這好看!"' \ '小紅說:"什么?衣服真好看?真的嗎?"' \ '小明回答到:"嗯,真的!我也想買。"' for i in cut_sent(s): print(i) #結果將人物語句也分開 """ 今天天氣好啊! 溫度高嗎? 你好,很高興遇見你,真不錯。 小明遇見小紅說:"你的衣服這好看! "小紅說:"什么? 衣服真好看? 真的嗎? "小明回答到:"嗯,真的! 我也想買。 " """
連接
這里解決辦法就是循環每一句,識別:"和"
兩個符號均有,則該句直接就是一整句,直接就加入
兩個符號都沒有,則該句直接就是一整句,直接就加入
如果只有前面符號而無后面符號,則記錄有前面符號那一句,依次往下拼接,直到遇到字符最后有“,將上面拼接好的語句作為一整句放入
def connect(paragraph): sentence_before = [] sentence_after = [] for each_para in paragraph: sentence_before.append(cut(each_para)) # 核心代碼!(將被錯分的語句進行連接) for each in sentence_before: list = [] sentence = "" FLAG = True # 非常關鍵!判斷有':“'的符號后面的語句是否繼續拼接 for i in each: if i.find(':“') * i.find('”') >= 0 and FLAG: list.append(i + sentence) else: FLAG = False sentence = sentence + i if i.find('”') > 0: list.append(sentence) sentence = "" FLAG = True sentence_after.append(list) return sentence_after
import re import pandas as pd # 將整篇文章進行分段 def segments(url): raw = pd.read_csv(url,names=['txt'], sep='aaa', encoding="GBK" ,engine='python') def m_head(tem_str): return tem_str[:1] def m_mid(tmp_str): return tmp_str.find("回 ") raw['head'] = raw.txt.apply(m_head) raw['mid'] = raw.txt.apply(m_mid) raw['len'] = raw.txt.apply(len) chap_num = 0 for i in range(len(raw)): if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30: chap_num += 1 if chap_num >= 40 and raw['txt'][i] == "附錄一:成吉思汗家族": chap_num = 0 raw.loc[i, 'chap'] = chap_num del raw['head'] del raw['mid'] del raw['len'] tmp_chap = raw[raw['chap'] == 7].copy() tmp_chap.reset_index(drop=True, inplace=True) tmp_chap['paraidx'] = tmp_chap.index paragraph = tmp_chap['txt'].values.tolist() return paragraph # 將每段進行分句 def cut(para): # 相關規則 pattern = ['([。!?\?])([^”'])','(\.{6})([^”'])','(\…{2})([^”'])','([。!?\?][”'])([^,。!?\?])'] for i in pattern: para = re.sub(i, r"\1\n\2", para) para = para.rstrip() return para.split("\n") # 將其中被錯分的語句進行連接(主要是針對話語) def connect(paragraph): sentence_before = [] sentence_after = [] for each_para in paragraph: sentence_before.append(cut(each_para)) # 核心代碼!(將被錯分的語句進行連接) for each in sentence_before: list = [] sentence = "" FLAG = True # 非常關鍵!判斷有':“'的符號后面的語句是否繼續拼接 for i in each: if i.find(':“') * i.find('”') >= 0 and FLAG: list.append(i + sentence) else: FLAG = False sentence = sentence + i if i.find('”') > 0: list.append(sentence) sentence = "" FLAG = True sentence_after.append(list) return sentence_after # 將最后的結果保存到DataFrame def toDataFrame(list3): df = pd.DataFrame(columns=["content","paragraph","sentence"]) for para_num,i in enumerate(list3): for sentence_num,j in enumerate(i): df_ = pd.DataFrame({"content": j, "paragraph": para_num,"sentence":sentence_num+1},index=[para_num]) df = df.append(df_,ignore_index=True) for i in df['content'].values.tolist(): print(i) def main(): # URL = "/Users/dengzhao/Downloads/金庸-射雕英雄傳txt精校版.txt" URL = input("請輸入文件地址:") para = segments(URL) result = connect(para) print(result) flag = input("以DataFrame形式輸出數據(Y,N):") if flag == 'Y': toDataFrame(result) elif flag == 'N': print("Thanks!!!!") else: print("程序結束!請檢查的你的輸入!") if __name__ == '__main__': main()
關于“Python如何實現對中文文本分段分句”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。