# 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.
# I to pierwsze słowo z tego trigramu dla tych danych dwóch słów jest tym słowem szukanym (leftcontext).
# bigramy i trigramy zapisywane są w dict jako jeden cały string a słowa odzielone są _ (podłogą).
withlzma.open('train/in.tsv.xz',mode='rt')asfile:
wordNo=1
word_bi_last=""
words=["","",""]
fori_,wordinenumerate(get_words(file)):# lecimy po kolei słowo po słowie. Słow ma usunięte wszelkie interpunkcja
iflen(word_bi_last)>0:# Mamy już pierwsze słow zbuforowane (szczególnie potrzebne dla pierwszego przebiegu) możemy więc zapisać
forsearch_for_wordinsearch_for_words:
search_for_word_s=search_for_word.split("_")
ifsearch_for_word_s[0]==word_bi_lastandsearch_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ń
ifi_==1:# If potrzebny aby zbuforować min 3 wyrazy dla trigramu w początkowej fazie przebiegu pętli.
words[0]=word_bi_last
words[1]=word
elifi_==2:# są już zbuforowane 3 słowa więc można zacząć zliczać trigramy tylko w początkowej fazie przebiegu pętli.
words[2]=word# To jest to 3 słowo
forsearch_for_wordinsearch_for_words:
search_for_word=search_for_word.split("_")
ifsearch_for_word[0]==words[1]andsearch_for_word[1]==words[2]:# Jeżeli szukane słowa należą do przedostatniego i ostatniego słowa trigramu to jest zwiększana liczba wystąpień tego trigramu.
# Szukanie trigramu który najczęściej wystąpił dla pierwszego szukanego słowa z szukanych słów z tablicy serch_for_word.
# To w przypadku gdyby szukane słowa w ogóle nie znalazły swojego dopasowania w zbiorze train to wtedy dostaną jakieś tam prawdopodobieństwo dla tego pierwszego słow z szukanych słów.
# Wczytanie linijiki i dzielenie jej na słowa, w przypadku napotkania luki (znaku \t) dodanie spacji aby oznaczyć jako słowo. Czyszczenie słów z różnych dziwnych znaków.
elifwas_tab:# Wystąpiła wcześniej luka (szukane pierwsze słowo) czyli zapisujemy słowo jako drugie słowo z bigramu, przeskakujemy iterację i potem zapisujemy trzecie słowo jeżeli w między czasie nie wystąpi jakaś luka inaczej zaczynamy proces od nowa.
ifnotsecond_word:# Sprawdzamy czy już drugie słowo nie zostało zbuforowane, jeżeli tak to oznacza, że teraz czekamy na trzecie słowo
second_word=word# Buforujemy drugie słowo
elifword_index_watch==1:# Kolejna iteracja czyli jest to trzecie słowo z bigramu to zapisujemy szukany bigram