Как преобразовать из символа в строку в Julia?

#julia

#джулия

Вопрос:

Я пытаюсь преобразовать слово в массив однократно закодированных массивов, используя простой словарь. Словарь, который я создал, состоит из символов.

 vocab = "abc"
char_id = Dict([ (index, char) for (char, index) in enumerate(vocab) ])

# Dict{Char,Int64} with 3 entries:
#   'a' => 1
#   'c' => 3
#   'b' => 2

function char_to_one_hot(char, char_id, max_length)
  one_hot = zeros(max_length)
  setindex!(one_hot, 1.0, char_id[char])
end

function word_to_one_hot(word, char_id, max_length)
  map((char) -> char_to_one_hot(char, char_id, max_length), split(word, ""))
end

word_to_one_hot(word, char_id, max_length)
  

К сожалению, это возвращает ошибку, потому char_id что Dict использует ключи символов вместо строк. Как я могу преобразовать словарь для использования строковых значений в качестве ключей или символов в строки, чтобы сравнение соответствовало?

 ERROR: KeyError: key "a" not found
Stacktrace:
 [1] getindex at ./dict.jl:467 [inlined]
 [2] char_to_one_hot(::SubString{String}, ::Dict{Char,Int64}, ::Int64) at ./REPL[456]:3
 [3] #78 at ./REPL[457]:2 [inlined]
 [4] iterate at ./generator.jl:47 [inlined]
 [5] _collect(::Array{SubString{String},1}, ::Base.Generator{Array{SubString{String},1},var"#78#79"{Dict{Char,Int64},Int64}}, ::Base.EltypeUnknown, ::Base.HasShape{1}) at ./array.jl:699
 [6] collect_similar at ./array.jl:628 [inlined]
 [7] map at ./abstractarray.jl:2162 [inlined]
 [8] word_to_one_hot(::String, ::Dict{Char,Int64}, ::Int64) at ./REPL[457]:2
 [9] top-level scope at REPL[458]:1
  

Ответ №1:

Строка уже может рассматриваться как набор символов, поэтому вам не нужно split слово.

Однако map он специализирован таким образом, что для строк вы можете отображать только функции, которые возвращают символы. И система вещания также обрабатывает строки как скаляры. Это оставляет нам несколько вариантов: простой for цикл или, возможно, генератор / понимание.

Я думаю, что в этом случае я бы пошел с пониманием:

 function char_to_one_hot(char, char_id, max_length)
    one_hot = zeros(max_length)
    setindex!(one_hot, 1.0, char_id[char])
end

function word_to_one_hot(word, char_id, max_length)
    [char_to_one_hot(char, char_id, max_length) for char in word]
end
  

что, я думаю, дает то, что вы ожидаете:

 julia> vocab = "abc"
"abc"

julia> char_id = Dict([ (index, char) for (char, index) in enumerate(vocab) ])
Dict{Char,Int64} with 3 entries:
  'a' => 1
  'c' => 3
  'b' => 2

julia> word_to_one_hot("acb", char_id, 5)
3-element Array{Array{Float64,1},1}:
 [1.0, 0.0, 0.0, 0.0, 0.0]
 [0.0, 0.0, 1.0, 0.0, 0.0]
 [0.0, 1.0, 0.0, 0.0, 0.0]
  


Если вы все еще хотите конвертировать между 1-символьными строками и символами, вы можете сделать это следующим образом:

 julia> str="a"; first(str)
'a': ASCII/Unicode U 0061 (category Ll: Letter, lowercase)

julia> chr='a'; string(chr)
"a"
  

Ответ №2:

Чтобы преобразовать строку длиной 1 в символ, укажите ссылку на первый символ строки с помощью [1] . Чтобы преобразовать символ в строку, используйте string() .

 julia> s = "c"
"c"

julia> s[1]
'c': ASCII/Unicode U 0063 (category Ll: Letter, lowercase)

julia> string(s)
"c"