Merhaba arkadaşlar.
Python dilini yazbel sayesinde öğrendim. Bu sitede emeği geçen herkese sonsuz teşekkürler. Uzun süredir derin öğrenme yöntemlerini araştırıyorum. Deep Language Learning. Derin öğrenme yöntemiyle önceden tanımlanmış olan bir sürü konuşma cümlesini programa veriyorsunuz ve python bunları makine diline göre kodlayıp sizin sorularınıza uygun yanıtlar veriyor. Biraz karmaşık ve epey zaman geçirmek gereken bir konu.
Bu konudan anlayan arkadaşlarıma bir sorum var?
Üstünde çalıştığım proje bu Chatbot Tutorial — PyTorch Tutorials 2.2.0+cu121 documentation
Jupyter defteri de burada https://pytorch.org/tutorials/_downloads/cf54d584af1322e88020549223e907dc/chatbot_tutorial.ipynb
Bu projede filmlerden alınan konuşmalar soru cevap şeklinde kodlandıktan sonra belirli ID’lere göre dizayn edilip makineye veriliyor.
Bu eğitimde anlatılan movie_lines.txt (aşağıdaki gibi)
L1045 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ They do not!
L1044 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ They do to!
L985 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ I hope so.
L984 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ She okay?
L925 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Let’s go.
L924 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ Wow
L872 +++$+++ u0 +++$+++ m0 +++$+++ BIANCA +++$+++ Okay – you’re gonna need to learn how to lie.
L871 +++$+++ u2 +++$+++ m0 +++$+++ CAMERON +++$+++ No
Bunu aşağıdaki şekilde çağırıyoruz
corpus_name = "cornell movie-dialogs corpus"
corpus = os.path.join("data", corpus_name)
def printLines(file, n=10):
with open(file, 'rb') as datafile:
lines = datafile.readlines()
for line in lines[:n]:
print(line)
printLines(os.path.join(corpus, "movie_lines.txt"))
Daha sonra ise movie_conversations.txt (aşağıdaki gibi)
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L194’, ‘L195’, ‘L196’, ‘L197’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L198’, ‘L199’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L200’, ‘L201’, ‘L202’, ‘L203’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L204’, ‘L205’, ‘L206’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L207’, ‘L208’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L271’, ‘L272’, ‘L273’, ‘L274’, ‘L275’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L276’, ‘L277’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L280’, ‘L281’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L363’, ‘L364’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L365’, ‘L366’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L367’, ‘L368’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L401’, ‘L402’, ‘L403’]
u0 +++$+++ u2 +++$+++ m0 +++$+++ [‘L404’, ‘L405’, ‘L406’, ‘L407’]
adlı dosyadan da yararlanarak aşağıdaki şekilde bir düzenleme yapılıyor
# Splits each line of the file into a dictionary of fields
def loadLines(fileName, fields):
lines = {}
with open(fileName, 'r', encoding='iso-8859-1') as f:
for line in f:
values = line.split(" +++$+++ ")
# Extract fields
lineObj = {}
for i, field in enumerate(fields):
lineObj[field] = values[i]
lines[lineObj['lineID']] = lineObj
return lines
# Groups fields of lines from `loadLines` into conversations based on *movie_conversations.txt*
def loadConversations(fileName, lines, fields):
conversations = []
with open(fileName, 'r', encoding='iso-8859-1') as f:
for line in f:
values = line.split(" +++$+++ ")
# Extract fields
convObj = {}
for i, field in enumerate(fields):
convObj[field] = values[i]
# Convert string to list (convObj["utteranceIDs"] == "['L598485', 'L598486', ...]")
utterance_id_pattern = re.compile('L[0-9]+')
lineIds = utterance_id_pattern.findall(convObj["utteranceIDs"])
# Reassemble lines
convObj["lines"] = []
for lineId in lineIds:
convObj["lines"].append(lines[lineId])
conversations.append(convObj)
return conversations
# Extracts pairs of sentences from conversations
def extractSentencePairs(conversations):
qa_pairs = []
for conversation in conversations:
# Iterate over all the lines of the conversation
for i in range(len(conversation["lines"]) - 1): # We ignore the last line (no answer for it)
inputLine = conversation["lines"][i]["text"].strip()
targetLine = conversation["lines"][i+1]["text"].strip()
# Filter wrong samples (if one of the lists is empty)
if inputLine and targetLine:
qa_pairs.append([inputLine, targetLine])
return qa_pairs
# Define path to new file
datafile = os.path.join(corpus, "formatted_movie_lines.txt")
delimiter = '\t'
# Unescape the delimiter
delimiter = str(codecs.decode(delimiter, "unicode_escape"))
# Initialize lines dict, conversations list, and field ids
lines = {}
conversations = []
MOVIE_LINES_FIELDS = ["lineID", "characterID", "movieID", "character", "text"]
MOVIE_CONVERSATIONS_FIELDS = ["character1ID", "character2ID", "movieID", "utteranceIDs"]
# Load lines and process conversations
print("\nProcessing corpus...")
lines = loadLines(os.path.join(corpus, "movie_lines.txt"), MOVIE_LINES_FIELDS)
print("\nLoading conversations...")
conversations = loadConversations(os.path.join(corpus, "movie_conversations.txt"),
lines, MOVIE_CONVERSATIONS_FIELDS)
# Write new csv file
print("\nWriting newly formatted file...")
with open(datafile, 'w', encoding='utf-8') as outputfile:
writer = csv.writer(outputfile, delimiter=delimiter, lineterminator='\n')
for pair in extractSentencePairs(conversations):
writer.writerow(pair)
# Print a sample of lines
print("\nSample lines from file:")
printLines(datafile)
Koda dikkat edilirse movie_conversations.txt dosyasından belirli idlerle birlikte bir birleştirme düzenleme yapılıyor.
Buraya kadar her şey normal.
Ama benim sorum şu. Benim elimde film altyazı dosyası var. Ona movie_lines.txt gibi diyebiliriz. Şuna benziyor.
Harika bir iş yaptın. Başardın. Başardın!
Uzun ve karmaşık bir dava dinlediniz. Birinci dereceden cinayet.
Taammüden adam öldürmek mahkememizde yargılanan en ciddi suçlamadır.
İfadeleri dinlediniz ve bu konuda yasaların ne dediğini öğrendiniz. Şimdi göreviniz oturup gerçekle yalanı
birbirinden ayırmaya çalışmak. Bir adam öldürüldü.
Bir diğer adamın hayatı pamuk ipliğinde. Eğer aklınızın bir köşesinde mantıklı
şüphe varsa, en ufak bir şüphe… …o zaman sanığın suçsuz olduğuna
dair karar vermelisiniz. Ama eğer hiçbir şüphe duymuyorsanız
ve bilinçli olarak karar verdiğinize eminseniz… …sanığı suçlu bulun.
Kararınız ne olursa olsun, oy birliği ile alınmalıdır.
Sanığı suçlu bulmanız halinde, …yargıçlar sanığın affına
asla karar veremezler. Bu davada idam cezası zorunludur.
Büyük bir sorumlulukla yüz yüzesiniz. Teşekkürler, beyler.
Yedek jüri üyeleri ayrılabilir. Jüri, kendi odasına çekilebilir.
Sakız ister misin? - Hayır, teşekkürler.
Açamıyorum. - Yardım edeyim.
İşte oldu. Biliyor musunuz?
Bu sabah hava tahmin bürosunu aradım. Bugün yılın en sıcak günü olacakmış.
Keşke burada bir klimamız olsaydı. - Adınız ne efendim?
Şuradaki benim adım. Sağ olun.
Pekâlâ beyler. Herkes burada. Eğer herhangi bir isteğiniz olursa,
ben hemen kapının önünde olacağım. Merhaba.
Kapıyı kilitlediklerini bilmiyordum. Elbette kilitlerler.
Ne sanmıştın? Bilmem. Hiç başıma gelmemişti.
O ne işe yarayacak? - Belki oylama yaparız diye düşünmüştüm.
Nefis bir fikir. Belki onu senatör bile seçeriz.
Hoşuna gitti mi? - Bilmem, oldukça ilginçti.
Gerçekten mi? Ben neredeyse uyuyacaktım. - Yani daha önce hiç jüride görev almamıştım.
Öyle mi? Ben birçok kez jüri üyeliği yaptım.
Şu avukatlar böyle apaçık davalarda bile konuşurlar da konuşurlar.
Hiç bu kadar boş konuşma dinlemiş miydin? - Ama sanırım bu onların işi.
Onların işi mi? Bu sistem böyle, ama…
…bana soracak olursan, ben bu salakları hiç düşünmeden tokatlardım.
Zaman ve paradan tasarruf olurdu. Haydi başlayalım.
Evet. Sanırım hepimizin yapacak bir sürü işi vardır.
Bende
Yani elimde
"lineID", "characterID", "movieID", "character", "text"
bu etiketlerden oluşan bir movie_conversations.txt dosyam yok. İhtiyacım da yok. Bunları girmeden sadece elimdeki altyazı dosyasıyla makineye öğretmek istiyorum ama ne yaptıysam olmadı.
Çok mu karışık anlattım bilmiyorum ama anlaşılmayan durumları yine açıklamak isterim