Python實現(xiàn)對中文文本分段分句
一、問題
實現(xiàn)對文本的分句,大致來說主要是以中文的句號、感嘆、問號等符號進行分句。難點在于直接分句可能會造成人物說話的語句也被分開!
二、步驟
分段
首先讀取文本,文本讀取后整體是一個字符串,每一個段之間是空白,所以分段之間按照空白分開來即可,最后存入一個paragraph_list,注意該list的下標(biāo)就是段落的順序號!其他的這里就不再多贅述!(可以查看最后的整體代碼)
分句
首先拿到上面分好的paragraph_list,循環(huán)拿到每一段,然后對每一段直接按照分句規(guī)則(正則表達式)進行分句,參考該文章
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")
# 這一段文字分句后應(yīng)該有的結(jié)果
s = '今天天氣好??!' \
'溫度高嗎?你好,很高興遇見你,真不錯。' \
'小明遇見小紅說:"你的衣服這好看!"' \
'小紅說:"什么?衣服真好看?真的嗎?"' \
'小明回答到:"嗯,真的!我也想買。"'
for i in cut_sent(s):
print(i)
#結(jié)果將人物語句也分開
"""
今天天氣好??!
溫度高嗎?
你好,很高興遇見你,真不錯。
小明遇見小紅說:"你的衣服這好看!
"小紅說:"什么?
衣服真好看?
真的嗎?
"小明回答到:"嗯,真的!
我也想買。
"
"""連接
這里解決辦法就是循環(huán)每一句,識別:"和"
- 兩個符號均有,則該句直接就是一整句,直接就加入
- 兩個符號都沒有,則該句直接就是一整句,直接就加入
- 如果只有前面符號而無后面符號,則記錄有前面符號那一句,依次往下拼接,直到遇到字符最后有“,將上面拼接好的語句作為一整句放入
def connect(paragraph):
sentence_before = []
sentence_after = []
for each_para in paragraph:
sentence_before.append(cut(each_para))
# 核心代碼?。▽⒈诲e分的語句進行連接)
for each in sentence_before:
list = []
sentence = ""
FLAG = True # 非常關(guān)鍵!判斷有':“'的符號后面的語句是否繼續(xù)拼接
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):
# 相關(guān)規(guī)則
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))
# 核心代碼?。▽⒈诲e分的語句進行連接)
for each in sentence_before:
list = []
sentence = ""
FLAG = True # 非常關(guān)鍵!判斷有':“'的符號后面的語句是否繼續(xù)拼接
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
# 將最后的結(jié)果保存到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形式輸出數(shù)據(jù)(Y,N):")
if flag == 'Y':
toDataFrame(result)
elif flag == 'N':
print("Thanks?。。?!")
else:
print("程序結(jié)束!請檢查的你的輸入!")
if __name__ == '__main__':
main()到此這篇關(guān)于Python實現(xiàn)對中文文本分段分句的文章就介紹到這了,更多相關(guān)Python中文文本分段分句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)的邏輯回歸算法示例【附測試csv文件下載】
這篇文章主要介紹了Python實現(xiàn)的邏輯回歸算法,結(jié)合具體實例形式分析了Python邏輯回歸算法相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-12-12
Python基礎(chǔ)知識快速上手入門學(xué)習(xí)
本篇文章使用代碼示例,一看就會,從基礎(chǔ)語法、變量類型、運算符和條件語句多個方面詳細(xì)闡述了Python基礎(chǔ)知識快速上手入門學(xué)習(xí)的內(nèi)容,希望本文能對Python初學(xué)者有所幫助2023-08-08
pandas數(shù)據(jù)處理清洗實現(xiàn)中文地址拆分案例
因為后續(xù)數(shù)據(jù)分析工作需要用到地理維度進行分析,所以需要把login_place字段進行拆分成:國家、省份、地區(qū)。感興趣的可以了解一下2021-06-06
Win10 GPU運算環(huán)境搭建(CUDA10.0+Cudnn 7.6.5+pytroch1.2+tensorflow1.
熟悉深度學(xué)習(xí)的人都知道,深度學(xué)習(xí)是需要訓(xùn)練的,本文主要介紹了Win10 GPU運算環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
詳解Pandas的三大利器(map,apply,applymap)
這篇文章主要為大家介紹了pandas中的三大利器: map、apply、applymap,他們經(jīng)常在進行數(shù)據(jù)處理的時候用到,需要的可以參考一下2022-02-02
Python&Matlab實現(xiàn)炫酷的3D旋轉(zhuǎn)圖
這篇文章主要為大家介紹了如何利用Python和Matlab分別實現(xiàn)酷炫的3D旋轉(zhuǎn)圖,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-04-04
Python批量修改xml的坐標(biāo)值全部轉(zhuǎn)為整數(shù)的實例代碼
這篇文章主要介紹了Python批量修改xml的坐標(biāo)值全部轉(zhuǎn)為整數(shù)的實例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

