diff --git a/run.py b/run.py index b8522c2..c3c2c00 100644 --- a/run.py +++ b/run.py @@ -26,6 +26,8 @@ def set_trigram_count(first_word, second_word, third_word, trigrams): trigrams[f"{first_word}_{second_word}_{third_word}"] += 1 def load_train(): + trigrams = {} + bigrams = {} with lzma.open('train/in.tsv.xz', mode='rt') as file: wordNo = 1 word_bi_last = "" @@ -48,9 +50,9 @@ def load_train(): word_bi_last = word def predict(search_for_words): - trigrams_complete = {} - bigrams_complete = {} - search_for_words_complete = [] # Tablica szukanych słów które wystąpiły w tekście z dokładnie tymi samymi szukanymi słowami w tej samej kolejności + trigrams_complete = {} # Tablica trigramów szukanych słów które wystąpiły w tekście z dokładnie tymi samymi szukanymi słowami w tej samej kolejności + bigrams_complete = {} # Tablica bigramów szukanych słów które wystąpiły w tekście z dokładnie tymi samymi szukanymi słowami w tej samej kolejności + # search_for_words_complete = [] # Tablica szukanych słów które wystąpiły w tekście z dokładnie tymi samymi szukanymi słowami w tej samej kolejności # Szukanie bigramów i trigramów które zawierają szukaną lukę dla słowa z tablicy search_for_words. # Jeżeli kolejność słów się zgadza liczona jest ilość wystąpień takich bigramów i trigramów z tymi słowami. # Przy czym dla trigramów sprawdzane są tylk odwa ostatnie słowa bo to logiczne. I potem sprawdzane jest który trigram dla danych słów najczęściej występuje. @@ -62,11 +64,12 @@ def predict(search_for_words): words = ["", "", ""] for i_, word in enumerate(get_words(file)): # lecimy po kolei słowo po słowie. Słow ma usunięte wszelkie interpunkcja word = word.lower() # normalizowanie na małe znaki + if not word: + continue if len(word_bi_last) > 0: # Mamy już pierwsze słow zbuforowane (szczególnie potrzebne dla pierwszego przebiegu) możemy więc zapisać for search_for_word in search_for_words: search_for_word_s = search_for_word.split("_") if search_for_word_s[0] == word_bi_last and search_for_word_s[1] == word: # Jeżeli szukane słowa tworzą bigram występujący w tekście trenującym to zwiększamy liczbę jego wystąpień - search_for_words_complete.append(search_for_word) set_bigram_count(word_bi_last, word, bigrams_complete) if i_ == 1: # If potrzebny aby zbuforować min 3 wyrazy dla trigramu w początkowej fazie przebiegu pętli. words[0]=word_bi_last @@ -83,7 +86,7 @@ def predict(search_for_words): words[2]=word for search_for_word in search_for_words: search_for_word = search_for_word.split("_") - if search_for_word[0] == words[1] and search_for_word[1] == words[2]: + if search_for_word[0] == words[1] and search_for_word[1] == words[2]: set_trigram_count(words[0], words[1], words[2], trigrams_complete) word_bi_last = word @@ -94,20 +97,23 @@ def predict(search_for_words): print (len(trigrams_complete)) # Szukanie trigramu który najczęściej wystąpił dla każdych szukanych danych dwóch słów z tablicy serch_for_word. # Z razcji z tego, że są to dokładnie te dwa słowa szukane mogę użyć słownika znalezionych bigramów - search_for_word_complete_bicounts = {} + for trigram in trigrams_complete: + if trigram[0] == "_": + print(trigram) left_context_search_for_word = {} - for search_for_word_complete in search_for_words_complete: - search_for_word_complete_bicounts[search_for_word_complete] = bigrams_complete[search_for_word_complete] - for search_for_word_complete_bicount in search_for_word_complete_bicounts: + for bigram_complete in bigrams_complete: max_count = 0 for trigram in trigrams_complete: - if search_for_word_complete_bicount in trigram and trigrams_complete[trigram] > max_count: + if bigram_complete in '_'.join(trigram.split("_")[1:3]) and trigrams_complete[trigram] > max_count: max_count = trigrams_complete[trigram] left_context = trigram.split("_")[0] - left_context_search_for_word[search_for_word_complete_bicount] = left_context - for search_for_word in left_context_search_for_word: - left_context = left_context_search_for_word[search_for_word] - print(f"{left_context} {' '.join(search_for_word.split('_'))}") + left_context_search_for_word[bigram_complete] = left_context + for search_for_word in search_for_words: + if search_for_word in left_context_search_for_word: + left_context = left_context_search_for_word[search_for_word] + print(f"{left_context} {' '.join(search_for_word.split('_'))} {trigrams_complete['_'.join([left_context, search_for_word])]/bigrams_complete[search_for_word]}") + else: + print(f"??? {' '.join(search_for_word.split('_'))}") # max_count_t = 0 # max_bi_key = ""