Как я могу решить функцию возврата (или в какой-то книге сказано, что это возврат), используя python в проекте НЛП? - PullRequest
0 голосов
/ 23 февраля 2020

Вот код, который я получил из класса github, и я написал для него некоторую функцию и несколько дней придерживался go.

В этом коде я должен использовать максимальное совпадение и затем возвращать его.

thai_vocab = ["ไ","ป","ห","า","ม","เ","ห","ส","ี","ไป","หา","หาม","เห","สี","มเหสี","!"]


from math import inf #infinity
def maximal_matching(c):
    #Initialize an empty 2D list
    d  =[[None]*len(c) for _ in range(len(c))]

    ####FILL CODE HERE####

    for i in range(len(d)):
      for j in range(len(d[0])):

        if(i == 0) and (c[i:j+1] in thai_vocab):
          d[0][j] = 1

        elif((j> 0) and (c[i:j+1] in thai_vocab)):
          res = [k for k in zip(*d)][i-1]
          temp = [] 

          for val in res: 
            if val != None : 
              temp.append(val) 

          d[i][j] = 1 + min(temp)  

        elif((c[i:j+1]) != "") :
          d[i][j] = inf

    ######################
    return d

def backtrack(d):
    eow = len(d)-1 # End of Word position
    word_pos = [] # Word position

    ####FILL CODE HERE####
 row_pos = len(d)-1


    while eow >=0:
      res = [k for k in zip(*d)][eow]
      temp = []
      for val in res: 
        if val != None : 
          temp.append(val)

      min_col = min(temp)

      while row_pos >= 0:

        if (d[row_pos][eow] == min_col) and (d[row_pos][eow-1] is None):
          word_pos.append((row_pos,eow))

        elif (d[row_pos][eow] == min_col) and (d[row_pos][eow-1] == inf) :
          eow-=1
        elif (d[row_pos][eow] == inf) and (d[row_pos-1][eow] == inf):
          eow-=1
        elif ((d[row_pos][eow] == min_col) and (d[row_pos][eow-1] == min_col) or (d[row_pos][eow-1] == inf)):
          eow -=1
        elif (d[row_pos][eow] == inf) and (d[row_pos][eow-1] is None) and (isinstance(d[row_pos-1][eow], int) == False):
           word_pos.append((row_pos,eow))
        else:
          row_pos-=1


      eow -=1








    ######################

    word_pos.reverse()
    return word_pos

Теперь я запускаю приведенный ниже код, чтобы получить результат от maxmatch ():

input_text = "ไปหามเหสี!"
out = maximal_matching(input_text)
for i in range(len(out)):
    print(out[i],input_text[i])

Результат

[1, 1, inf, inf, inf, inf, inf, inf, inf, inf] ไ
[None, 2, inf, inf, inf, inf, inf, inf, inf, inf] ป
[None, None, 2, 2, 2, inf, inf, inf, inf, inf] ห
[None, None, None, 3, inf, inf, inf, inf, inf, inf] า
[None, None, None, None, 3, inf, inf, inf, 3, inf] ม
[None, None, None, None, None, 3, 3, inf, inf, inf] เ
[None, None, None, None, None, None, 4, inf, inf, inf] ห
[None, None, None, None, None, None, None, 4, 4, inf] ส
[None, None, None, None, None, None, None, None, 5, inf] ี
[None, None, None, None, None, None, None, None, None, 4] !

На последнем шаге я пытаюсь найти слово, которое я токенизировал алгоритмом (в данном случае оно разделяется на 4 слова в моем словаре).

def print_tokenized_text(d, input_text):
    tokenized_text=[]
    for pos in backtrack(d):
        #print(pos)
        tokenized_text.append(input_text[pos[0]:pos[1]+1])

    print("|".join(tokenized_text))

print_tokenized_text(out,input_text)

Результат должен быть

ไป|หา|มเหสี|!

, но в этом случае я получил ошибку, она не может решить мою функцию с моим кодом, я не знаю, как оптимизировать Можете ли вы предложить мне, какой алгоритм будет лучше для поиска значения и распечатать результат?

Заранее спасибо

...