У меня есть скрипт, который позволяет мне извлекать информацию, полученную из Excel, в список, этот список содержит строковые значения, содержащие такие фразы, как: «Мне нравится готовить», «Мою собаку зовут Дуг» и т. Д.

Итак, я попробовал этот код, который нашел в Интернете, зная, что функция int позволяет преобразовать фактическую фразу в числа.

Код, который я использовал:

lista=["I like cooking", "My dog´s name is Doug", "Hi, there"]

test_list = [int(i, 36) for i in lista]

Запустив код я получаю следующую ошибку:

builtins.ValueError: недопустимый литерал для int () с основанием 36: «Я люблю готовить»

Но я пробовал код без пробелов и знаков препинания, и я получил фактическое значение, но мне нужно принять во внимание эти символы.

1
ChrisCaLev 8 Июл 2019 в 20:16

3 ответа

Лучший ответ

Чтобы расширить подход bytearray, вы можете использовать int.to_bytes и int.from_bytes, чтобы получить обратно целое число, хотя целые числа будут намного длиннее, чем вы показываете в своем примере.

def to_int(s):
    return int.from_bytes(bytearray(s, 'utf-8'), 'big', signed=False)

def to_str(s):
    return s.to_bytes((s.bit_length() +7 ) // 8, 'big').decode()

lista = ["I like cooking",
            "My dog´s name is Doug",
            "Hi, there"]

encoded = [to_int(s) for s in lista]

decoded = [to_str(s) for s in encoded]

Кодируются :

[1483184754092458833204681315544679,
 28986146900667755422058678317652141643897566145770855,
 1335744041264385192549]

Декодируется :

['I like cooking',
 'My dog´s name is Doug',
 'Hi, there']
2
Jab 8 Июл 2019 в 19:49

Поскольку вы хотите преобразовать свой текст для AI, вы должны сделать что-то вроде этого:

import re

def clean_text(text, vocab):
    '''
    normalizes the string
    '''
    chars = {'\'':[u"\u0060", u"\u00B4", u"\u2018", u"\u2019"], 'a':[u"\u00C0", u"\u00C1", u"\u00C2", u"\u00C3", u"\u00C4", u"\u00C5", u"\u00E0", u"\u00E1", u"\u00E2", u"\u00E3", u"\u00E4", u"\u00E5"],
                'e':[u"\u00C8", u"\u00C9", u"\u00CA", u"\u00CB", u"\u00E8", u"\u00E9", u"\u00EA", u"\u00EB"],
                'i':[u"\u00CC", u"\u00CD", u"\u00CE", u"\u00CF", u"\u00EC", u"\u00ED", u"\u00EE", u"\u00EF"],
                'o':[u"\u00D2", u"\u00D3", u"\u00D4", u"\u00D5", u"\u00D6", u"\u00F2", u"\u00F3", u"\u00F4", u"\u00F5", u"\u00F6"],
                'u':[u"\u00DA", u"\u00DB", u"\u00DC", u"\u00DD", u"\u00FA", u"\u00FB", u"\u00FC", u"\u00FD"]}

    for gud in chars:
        for bad in chars[gud]:
            text = text.replace(bad, gud)

    if 'http' in text:
        return ''

    text = text.replace('&', ' and ')
    text = re.sub(r'\.( +\.)+', '..', text)
    #text = re.sub(r'\.\.+', ' ^ ', text)
    text = re.sub(r',+', ',', text)
    text = re.sub(r'\-+', '-', text)
    text = re.sub(r'\?+', ' ? ', text)
    text = re.sub(r'\!+', ' ! ', text)
    text = re.sub(r'\'+', "'", text)
    text = re.sub(r';+', ':', text)
    text = re.sub(r'/+', ' / ', text)
    text = re.sub(r'<+', ' < ', text)
    text = re.sub(r'>+', ' > ', text)
    text = text.replace('%', '% ')
    text = text.replace(' - ', ' : ')
    text = text.replace(' -', " - ")
    text = text.replace('- ', " - ")
    text = text.replace(" '", " ")
    text = text.replace("' ", " ")

    #for c in ".,:":
    #   text = text.replace(c + ' ', ' ' + c + ' ')

    text = re.sub(r' +', ' ', text.strip(' '))

    for i in text:
        if i not in vocab:
            text = text.replace(i, '')

    return text

def arr_to_vocab(arr, vocabDict):
    '''
    returns a provided array converted with provided vocab dict, all array elements have to be in the vocab, but not all vocab elements have to be in the input array, works with strings too
    '''
    try:
        return [vocabDict[i] for i in arr]

    except Exception as e:
        print (e)
        return []

def str_to_vocab(vocab):
    '''
    generates vocab dicts 
    '''
    to_vocab = {}
    from_vocab = {}

    for index, i in enumerate(vocab):
        to_vocab[index] = i
        from_vocab[i] = index

    return to_vocab, from_vocab

vocab = sorted([chr(i) for i in range(32, 127)]) # a basic vocab for your model
vocab.insert(0, None)

toVocab, fromVocab = str_to_vocab(vocab) #converting vocab into usable form

your_data_str = ["I like cooking", "My dog´s name is Doug", "Hi, there"] #your data, a list of strings

X = []

for i in your_data_str:
    X.append(arr_to_vocab(clean_text(i, vocab), fromVocab)) # normalizing and converting to "ints" each string

# your data is now almost ready for your model, just pad it to the size of your input with zeros and it's done

print (X)

Если вы хотите узнать, как преобразовать строку «int» обратно в строку, скажите мне.

0
okawo 8 Июл 2019 в 19:09

Как отмечено в комментариях, преобразование фраз в целые числа с int() не будет работать, если фраза содержит пробел или большинство не алфавитно-цифровых символов с несколькими исключениями.

Если все ваши фразы используют общую кодировку, вы можете получить что-то ближе к тому, что хотите, преобразовав свои строки в байтовые массивы. Например:

s = 'My dog´s name is Doug'

b = bytearray(s, 'utf-8')
print(list(b))
# [77, 121, 32, 100, 111, 103, 194, 180, 115, 32, 110, 97, 109, 101, 32, 105, 115, 32, 68, 111, 117, 103]

Оттуда вам придется выяснить, хотите ли вы сохранить список целых чисел, представляющих каждую фразу, или объединить их каким-либо образом в зависимости от того, что вы собираетесь делать с этими числовыми строковыми представлениями.

0
benvc 8 Июл 2019 в 18:34