所以,如果你有一個句子作為字串:
sentence = "Good morning, i'm doing well today."
然后把它變成一個子字串陣列:
words = sentence.split(" ")
> ["Good", "morning,", "i'm", "doing", "well", "today."]
你有一個 WordBank 模型,它有以下記錄:
word_to_find: "i'm"
replace_with: "I'm"
我希望能夠遍歷單詞,并檢查 WordBank。如果回傳 true,則用更正的替換替換該子字串。
words.each do |word|
if WordBank.all.map { \f| f.word_to_find == word }
print "True"
end
end
> True
words.each |word|
if WordBank.all.map { |f| f.word_to_find == word }
word == .replace_with
end
end
在哪里 .replace_with,我需要能夠呼叫回傳 true 的相同 WordBank 記錄,但不知道如何。
所以最終結果應該回傳一個陣列
> ["Good", "morning", "I'm", "doing", "well", "today."]
然后可以將其放回句子變數:
sentence = words.join(" ")
如果有更有效的方法可以做到這一點,請隨時告訴我。
uj5u.com熱心網友回復:
我們得到:
sentence = "Good morning, i'm doing well today."
changes = { "i'm"=>"I'm" }
首先構造一個新的哈希:
h = Hash.new { |h,k| k }.merge(changes)
#=> {"i'm"=>"I'm"}
我使用了Hash::new的形式,它需要一個塊來創建一個changes合并的空散列。h被視為具有相同的鍵和值,changes但它現在具有Hash#default_proc:
h.default_proc
#=> #<Proc:0x00007f80970fe190 <main>:3>
因此,
h["i'm"]
#=> "I'm"
正常(因為h有 key "i'm"),但如果h沒有 key ,比如 ,"well"可以看出默認 proc 導致
h["well"]
回傳它的引數 ( "well")。
因此,我們可以使用String#gsub的形式,將哈希作為可選的第二個引數:
sentence.gsub(/[\w'] /, h)
#=> "Good morning, I'm doing well today."
正則運算式/[\w'] /匹配字符類中的一個或多個字符[\w'],即單詞字符和撇號。
考慮第二個例子。
sentence = "Good morning, i'm good today."
changes = { "i'm"=>"I'm", "morning"=>"evening", "Good"=>"Bad", "good"=>"bad" }
h = Hash.new { |h,k| k }.merge(changes)
#=> {"i'm"=>"I'm", "morning"=>"evening", "Good"=>"Bad", "good"=>"bad"}
sentence.gsub(/[\w'] /, h)
#=> "Bad evening, I'm bad today."
除其他事項外,請注意保留了額外的空格,而如果將它們sentence分解為單詞,則將其洗掉,然后修改單詞然后加入。
uj5u.com熱心網友回復:
sentence = "Good morning, i'm doing well today."
wordbank = [ { word_to_find: "i'm", replace_with: "I'm" } ]
wordbank.map { |f| sentence.gsub(f[:word_to_find], f[:replace_with]) }
uj5u.com熱心網友回復:
我們可以創建一個 wordbank 哈希并回圈它以替換它而無需檢查,因為它只會替換句子中存在的單詞。
gsub用于替換句子中的單詞,因為我們要替換我們包含的!版本
wordbank = {
"i'm": "I'm"
}
sentence = "Good morning, i'm doing well today."
wordbank.each do |k, v|
sentence.gsub!(k.to_s, v)
end
假設您的詞庫超過 10000 個單詞并且句子很小,那么更好的方法是回圈遍歷被空格分割的句子并將其替換為詞庫中存在的單詞。
wordbank = {
"i'm": "I'm"
}
wordbank.default_proc = proc do |hsh, key|
key.to_s
end
sentence = "Good morning, i'm doing well today."
words = sentence.split(/(\s )/) # splitted with regex to preserve spaces
# which will help to get the same string length
# when joined back together
words = words.map do |word|
wordbank[word.to_sym]
end
注意:在 ruby?? 版本 3.0.0 上測驗
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/445697.html
