2017-03-08 2 views
1

문자열이 테이블의 문자열과 가까운 경우 테이블의 문자열로 바꿉니다 방법이 있습니까?루아에서 문자열 사전 함수를 어떻게 만드나요?

맞춤법 검사 기능처럼 테이블을 통해 검색하고 입력이 테이블에서 하나에 가까워지면 수정되므로 테이블과 문자열이 동일합니다.

+0

죄송합니다. 나는 느린 학습자로서 문자열 처리에 대해 알고 있습니다. –

+0

사용 사전에 모든 문자열로 문자열을 비교해야한다 [편집 거리 (https://en.wikipedia.org/wiki/Edit_distance) –

+0

실제로, [JARO - 윈 클러 거리] (HTTPS : //en.wikipedia. org/wiki/Jaro % E2 % 80 % 93Winkler_distance)는 일반적으로보다 현실적인 결과를 제공합니다. –

답변

1

당신이 코드 : 참조 코드를 사용할 수 있습니다 여기에서있다 : https://github.com/badarsh2/Algorithm-Implementations/blob/master/Levenshtein_distance/Lua/Yonaba/levenshtein.lua

local function min(a, b, c) 
    return math.min(math.min(a, b), c) 
end 

local function matrix(row,col) 
    local m = {} 
    for i = 1,row do m[i] = {} 
    for j = 1,col do m[i][j] = 0 end 
    end 
    return m 
end 

local function lev(strA,strB) 
    local M = matrix(#strA+1,#strB+1) 
    local i, j, cost 
    local row, col = #M, #M[1] 
    for i = 1, row do M[i][1] = i - 1 end 
    for j = 1, col do M[1][j] = j - 1 end 
    for i = 2, row do 
    for j = 2, col do 
     if (strA:sub(i - 1, i - 1) == strB:sub(j - 1, j - 1)) then cost = 0 
     else cost = 1 
     end 
    M[i][j] = min(M[i-1][j] + 1,M[i][j - 1] + 1,M[i - 1][j - 1] + cost) 
    end 
    end 
    return M[row][col] 
end 

local refTable = {"hell", "screen"} 

local function getClosestWord(pInput, pTable, threesold) 
    cDist = -1 
    cWord = "" 
    for key, val in pairs(pTable) do 
    local levRes = lev(pInput, val) 
    if levRes < cDist or cDist == -1 then 
     cDist = levRes 
     cWord = val 
    end 
    end 
    print(cDist) 
    if cDist <= threesold then 
    return cWord 
    else 
    return pInput 
    end 
end 

a = getClosestWord("hello", refTable, 3) 
b = getClosestWord("screw", refTable, 3) 
print(a, b) 

세 번째 매개 변수는 분 거리 threesold보다 높은 경우, 단어는 대체되지 않습니다, threesold입니다.

+0

덕분에 내 루아 보트 개발에 많은 도움이 될 것입니다! –

+0

당신의 봇에 대한 행운을 빕니다 :) – Sygmei

관련 문제