python调换字符串顺序_python实现指定字符串交换
前言
我想實現(xiàn)的功能過于復(fù)雜,我都不知道我能不能用語言表述清楚,花了五六個小時寫了這個程序,還是好好陳述一下需求吧。
因為我做命名實體識別嘛,我昨天想起來把數(shù)據(jù)擴充一下,怎么擴充呢,就是把相同類型的實體互換一下位置。例如
和
把這兩個互換,就可以實現(xiàn)擴充數(shù)據(jù)集的目的了。再對其它類型的實體也互換,例如
之類。
所以我們來整理下需求。
需求
總
一個大方向就是把同種類型的實體互換,并將互換后的數(shù)據(jù)寫進一個文件中,當作擴充的數(shù)據(jù)集。
分
如何實現(xiàn)實體互換呢?
識別所有類型的實體并把它們放入不同的列表中,見程序段1;
實現(xiàn)互換之前,需要知道用什么換?這里我用random.shuffle函數(shù)打亂實體list得到一個新的list B,將list A中的元素替換為list B的元素,見程序段2;
有了list A和list B,就可以替換了,將list A對應(yīng)的元素替換為list B的元素,見程序段3;
替換完成,寫入文件,見程序段4。
看起來好像不是很復(fù)雜,其實里面有很多坑需要跨過去,只有自己動手寫才會知道問題在哪兒,編程真有意思。
import random
a = []
b = []
with open('1.txt', encoding='utf8') as file:
for line in file:
line = line.strip().split(' ')
if len(line) == 2:
a.append(line[0])
b.append(line[1])
else:
a.append('Newline')
b.append('Newline' + '\n')
with open('2.txt', 'w', encoding='utf8') as file2:
for index, value in enumerate(a):
file2.write(value + ' ' + b[index] + ' ')
loc = ''
name = ''
org = ''
loc_list = []
name_list = []
org_list = []
entity = ''
entity_list = ['LOC', 'ORG', 'NAME', 'TITLE', 'RACE', 'PRO', 'EDU', 'CONT']
# all_entity_list是雙重列表,子列表是每種實體的列表
all_entity_list = []
all_entity_list_copy = []
# 生成LOC實體列表
# 用random.shuffle會改變loc_list的所有副本,即便你在使用shuffle之前就copy了一份,還是會被改掉。
# 所以我用一個新的空列表來接收原列表的值
# 程序段1:識別不同類型的實體并分別存入兩個list中,這是因為后面shuffle操作會打亂list,所以多保存一個list方便實現(xiàn)之后的替換。
for ind, val in enumerate(entity_list):
part_entity_list = []
# 得從這兒開始就創(chuàng)建copy
part_entity_list_copy = []
for index, value in enumerate(b):
if value.find(val) != -1:
entity += a[index] + ' ' + value + ' '
if value.find('E-' + val) != -1:
part_entity_list.append(entity)
part_entity_list_copy.append(entity)
entity = ''
all_entity_list.append(part_entity_list)
all_entity_list_copy.append(part_entity_list_copy)
# print(all_entity_list)
# 保留原列表,并生成shuffle后的列表
# all_entity_list_copy = []
# loc_list_copy=loc_list
# print('*****',all_entity_list_copy)
# shuffle all_entity_list中的子列表
# 程序段2:打亂原實體list
all_entity_list_shuffle = []
for part_entity_list in all_entity_list:
random.shuffle(part_entity_list)
all_entity_list_shuffle.append(part_entity_list)
# 驗證是否shuffle成功
print('*****', all_entity_list_copy)
print('*****', all_entity_list_shuffle)
file3 = open('2.txt', encoding='utf8')
# 程序段3:將list A中的元素替換為list B的元素
with open('4.txt', 'w', encoding='utf8') as file4:
# 對每一行而言
for i in file3:
# 對于不同類型的實體,我需要嵌套多個for循環(huán)
for ind, part_entity_list in enumerate(all_entity_list_copy):
# 進入每個子列表
for index, value in enumerate(part_entity_list):
# print(value+'\n')
# print(all_entity_list[ind][index]+'\n')
if i.find(value) != -1:
# print(value+'\n')
# print(all_entity_list_shuffle[ind][index]+'\n')
i = i.replace(value, all_entity_list[ind][index])
# 當我在一個句子中找到第一個要被替換的字符串后,先替換,然后就跳出for循環(huán),
# 不然的話程序會一直檢測這個句子中是否還有要被替換的字符串,那我之前做的替換就會被后面的所取代。
break
file4.write(i)
# 程序段4:生成一個新的打亂后的文件5.txt
words=[]
labels=[]
with open('4.txt', encoding='utf-8') as file:
for line in file:
line = line.strip().split(' ')
for num in range(len(line)):
if (num+1)%2==0:
labels.append(line[num])
else:
words.append(line[num])
with open('5.txt', 'w',encoding='utf-8') as f:
for num in range(len(labels)):
f.write(words[num]+' '+labels[num]+'\n')
file5 = open('5.txt', encoding='utf-8')
with open('6.txt', 'w', encoding='utf-8') as file6:
text = file5.read()
file6.write(text.replace('Newline', ''))
效果圖
源文件
現(xiàn)文件
剩下的就是把源文件和現(xiàn)文件復(fù)制粘貼到一起作為一個數(shù)據(jù)集了,不知道這樣會不會提升模型精度,但愿吧。
總結(jié)
以上是生活随笔為你收集整理的python调换字符串顺序_python实现指定字符串交换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音频管理_人力资源管理师考试历年真题试卷
- 下一篇: 调整了canvas的高度页面变化后还原_