Как я могу использовать «связывание с seq2seq» в Pytorch, используя мои собственные данные? - PullRequest
0 голосов
/ 08 апреля 2019

Я следую за руководством здесь

В настоящее время это модель:

SOS_token = 0
EOS_token = 1


class Lang:
    def __init__(self, name):
        self.name = name
        self.word2index = {}
        self.word2count = {}
        self.index2word = {0: "SOS", 1: "EOS"}
        self.n_words = 2  # Count SOS and EOS

    def addSentence(self, sentence):
        for word in sentence.split(' '):
            self.addWord(word)

    def addWord(self, word):
        if word not in self.word2index:
            self.word2index[word] = self.n_words
            self.word2count[word] = 1
            self.index2word[self.n_words] = word
            self.n_words += 1
        else:
            self.word2count[word] += 1
def unicodeToAscii(s):
    return ''.join(
        c for c in unicodedata.normalize('NFD', s)
        if unicodedata.category(c) != 'Mn'
    )

# Lowercase, trim, and remove non-letter characters


def normalizeString(s):
    s = unicodeToAscii(s.lower().strip())
    s = re.sub(r"([.!?])", r" \1", s)
    s = re.sub(r"[^a-zA-Z.!?]+", r" ", s)
    return s
def readLangs(lang1, lang2, reverse=False):
    print("Reading lines...")

    # Read the file and split into lines
    lines = open('Scribe/%s-%s.txt' % (lang1, lang2), encoding='utf-8').\
        read().strip().split('\n')

    # Split every line into pairs and normalize
    pairs = [[normalizeString(s) for s in l.split('\t')] for l in lines]

    # Reverse pairs, make Lang instances
    if reverse:
        pairs = [list(reversed(p)) for p in pairs]
        input_lang = Lang(lang2)
        output_lang = Lang(lang1)
    else:
        input_lang = Lang(lang1)
        output_lang = Lang(lang2)

    return input_lang, output_lang, pair
MAX_LENGTH = 5000

eng_prefixes = (
    "i am ", "i m ",
    "he is", "he s ",
    "she is", "she s ",
    "you are", "you re ",
    "we are", "we re ",
    "they are", "they re "
)


def filterPair(p):
    return len(p[0].split(' ')) < MAX_LENGTH and \
        len(p[1].split(' ')) < MAX_LENGTH and \
        p[1].startswith(eng_prefixes)


def filterPairs(pairs):
    return [pair for pair in pairs if filterPair(pair)]
def prepareData(lang1, lang2, reverse=False):
    input_lang, output_lang, pairs = readLangs(lang1, lang2, reverse)
    print("Read %s sentence pairs" % len(pairs))
    pairs = filterPairs(pairs)
    print("Trimmed to %s sentence pairs" % len(pairs))
    print("Counting words...")
    for pair in pairs:
        input_lang.addSentence(pair[0])
        output_lang.addSentence(pair[1])
    print("Counted words:")
    print(input_lang.name, input_lang.n_words)
    print(output_lang.name, output_lang.n_words)
    return input_lang, output_lang, pairs

Разница между тем, что я пытаюсь сделать, и руководством являетсячто я пытаюсь вставить свои входные языки в виде списка строк вместо чтения их из файла:

pairs=['string one goes like this', 'string two goes like this'] 
input_lang = Lang(pairs[0][0])
output_lang = Lang(pairs[1][1]) 

Но мне кажется, что когда я пытаюсь посчитать количество слов input_lang.n_words в моемстрока, которую я всегда получаю 2.

Есть ли что-то, чего мне не хватает при вызове класса Lang?

Обновление:
Я бегал

language = Lang('english')

for sentence in pairs: language.addSentence(sentence)

print (language.n_words)

, и это дало мне количество слов в pairs
Хотя, это не дает мне input_lang и output_lang как это сделал гид:

for pair in pairs:
    input_lang.addSentence(pair[0])
    output_lang.addSentence(pair[1])

1 Ответ

0 голосов
/ 08 апреля 2019

Итак, во-первых, вы инициализируете объект Lang вызовами pairs[0][0] и pairs[1][1], что совпадает с Lang('s') и Lang('t')

Предполагается, что объект Langбыть объектом, который хранит информацию о языке, поэтому я ожидаю, что вам нужно только инициализировать его один раз с Lang('english'), а затем добавить предложения из вашего набора данных к объекту Lang с помощью функции Lang.addSentence.

Прямо сейчас вы вообще не загружаете свой набор данных в объект Lang, поэтому, когда вы хотите знать language.n_words, это просто начальное значение, которое он получает при создании объекта self.n_words = 2 # Count SOS and EOS

Ничто из того, что вы делаете в своем вопросе, не имеет никакого смысла, но я думаю, что вам нужно следующее:

language = Lang('english')

for sentence in pairs: language.addSentence(sentence)

print (language.n_words)
...