Türkçe doğal dil işleme. Deep Language Learning

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

Nasil bir birlestirme duzenlemesi yapiliyor?

Senin de ayni duzenlemeyi yapman lazim.

Satirlarin diyalog diyalog ayrildigini tahmin ediyorum. Altyazilari zamanlarina gore gruplamayi deneyebilirsin.

İşte o düzenleme yapılmadan sadece elimdeki altyazı dosyasındaki diyalogları okutmak istiyorum. Kodda değiştirme yapmam gerekiyor bunun için. Onu bulamıyorum.

Modele girdigi yerden (trainIters()) baslayip dosyanin okundugu yere kadar gecirdigi degisimleri takip edip, yakalayabildigin noktada kendi datani koyman lazim. Bu noktadan sonra hazir yazilmis fonksiyonlari kullanmaya devam edebilirsin.

Veya en bastan girip dosyani movie_lines.txt / movie_conversations.txt formatina cevirebilirsin.

Hocam sanırım sorun ascii karakterlerle ilgili bir durummuş. Tam olarak çözünce buraya yazacağım.

Başka bir sorum daha olacak.

Mesela bende deneme.txt diye bir dosya var diyelim, içerik şu şekilde binlerce alt alta dize

Bir gün gelirim.
Ne yaptın.
Eve gideceğim.
Tamam ben de gelirim.
Bekliyorum öyleyse.
Gelirim.

Benim istediğim şey şu, ilk iki sıra yan yana yazılsın. Yan yana yazılırken de aralarına benim istediğim özel karakter konulsun. Yani şöyle

Bir gün gelirim.Ne yaptın.
Eve gideceğim.Tamam ben de gelirim.
Bekliyorum öyleyse.Gelirim.

bana öyle bir kod lazım ki bunları bu şekilde yazdırabileyim. Tam dört saattir arıyorum ama en sonunda pes ettim ve uyumaya gidiyorum. Herkese şimdiden teşekkürler.

1 Beğeni
  • Merhaba, en basitinden join() kullanabilirsiniz.

Öncesi:

Bir gün gelirim.
Ne yaptın.
Eve gideceğim.
Tamam ben de gelirim.
Bekliyorum öyleyse.
Gelirim.

Kodlar:

file = open("deneme.txt", "r")
texts = file.readlines()
length = len(texts)
file.close()

for i in range(length - 1):  # En sondaki "\n"leri siler. (Son satır hariç)
    texts[i] = texts[i][:-1]

file = open("deneme_2.txt", "w")
texts_2 = ""
ozel_karakterler = "<|>"  # Araya yerleştirilmesini istediğiniz karakterler.
for line in range(0, length, 2):  # range(başlangıç, bitiş, artış):
    texts_2 += ozel_karakterler.join(texts[line + n] for n in range(2))
    texts_2 += "\n"

file.write(texts_2)
file.close()

Sonrası:

Bir gün gelirim.<|>Ne yaptın.
Eve gideceğim.<|>Tamam ben de gelirim.
Bekliyorum öyleyse.<|>Gelirim.
2 Beğeni

Bu aranabilecek bir sey degil. “12.5 santim arayla iki adet civi cakabilen alet” gibi bir sey. Bir noktada cetvel ve cekic kullanmayi ogrenip kendin yapman lazim.

Edit:

Veya duruma ozel cekic uretmesiyle unlu firmaya gidebilirsin:

$ echo -e "Bir gün gelirim.\nNe yaptın.\nEve gideceğim.\nTamam ben de gelirim.\nBekliyorum öyleyse.\nGelirim." | sed -e 'N;s/\n/■/'
Bir gün gelirim.■Ne yaptın.
Eve gideceğim.■Tamam ben de gelirim.
Bekliyorum öyleyse.■Gelirim.
2 Beğeni

Çok teşekkür ederim sorun çözüldü.

1 Beğeni