2013-12-21 2 views
1

내가 매끄러운 10K에 대한 변환 비율을주는 문장의 집합 같은구문 분석 문장 추출 변환

  • 만 뭔가 ∫1
  • ∫1에 대한이 값
  • 1200 뭔가 ∫0.1
  • 에 대한
  • 3 스톰에 대한 3000 Smth 판매

위의 문장은 모두 가상의 무언가 (SMTH)와 가상의 무언가 (SMTH)의 비율을 보여줍니다. ∫의 정수 (정수). 이 두 단위 사이의 전환율을 추출 할 방법이 필요합니다. 어려움은 숫자가 다른 방식으로 (10,000 또는 10000 또는 10k) 포맷 될 수 있고, 단위가 다르게 쓰일 수 있으며 (SMTH 및 다른 대문자 사용), 단위 순서가 다릅니다 ("x SMTH for ∫x"또는 "∫x for x SMTH "), 때로는 단위가 ∫x 또는 x∫로 기록됩니다.

TL : DR : 어떻게 든 위의 문자열을 수학적 관계로 형식화하지만 여러 형식에주의를 기울여야합니다.

나는 이것이 많이 묻고 꽤 복잡하다는 것을 알고있다. 이미 비슷한 질문이있는 경우 기꺼이 살펴볼 것입니다.

당신이 물어 보는 언어는 무엇입니까?

var val = get sentence, 
    integral, 
    something; 
val = val.replace(",", "").replace("k ", "000 ").replace("m ", "000000 ").replace("million ", "000000 ").replace(" million ", "000000 ").replace(" something", "SMTH").replace(" smth", "SMTH"); 
words = val.split(" "); 
for (var i = 0; i < words.length; i++) { 
    if (words[i].indexOf("$")!==-1) { 
    integral = words[i].replace("∫" , ""); 
    } else if (words[i].indexOf("SMTH")!==-1) { 
    something = words[i].replace("SMTH" , ""); 
    } 
} 

단순화 된 자바 스크립트/의사 코드

+0

단어 구조가있는 문장이 정말 다양합니다. 돈을 위해 뭔가. 뭔가를위한 돈. 이것을 번역하는데 많은 어려움이있는 것 같습니다. – sln

+0

나는 하나의 통화에 대한 모든 언급을 하나의 키워드로 바꾸어 통화 묵상을 통일하고 다른 숫자를 "실제"숫자로 포맷하려고 시도했다. 그게 좀 깨끗해 지긴하지만, "for"나 "selling"같은 필러 단어를 모두 다 써 버리면됩니다. ( – aNewStart847

답변

1

모든 예제 당신이 "를"사용하여 별도의 변환이 있습니다 바람직 PHP 또는 JS하지만, 의사 코드는 좋은 시작

편집입니다. 그래서 많은 조합이 없습니다. 할 수있는 일은 각 통화를 식별하는 단어 목록을 가지고, 숫자와 일치하는 정규 표현식을 사용하면 왼쪽과 오른쪽이 "for"로 구분됩니다. 당신은 당신이 각면 어떤 양에 어떤 통화와 데이터 구조를해야이 루프를 마친 후

for each word: 
    if it's a known currency identifier 
     Store what is the currency 
    else if it's a number 
     Store the value 
    else if it's the "for" word 
     Change side 
    end if 
end for 

: 는 다음 의사 코드를 실행하는 것입니다 각 어구를 처리합니다.

+0

많은 도움이되었지만, 당신이 한 것을 정확히 사용하지는 못했지만 약간의 접근 방식을 변경했습니다. 내 질문을 편집했습니다. 감사합니다! – aNewStart847

1

나는이 선을 따라 뭔가를 구현하는 데 찌른 듯이 보였다. 다른 사람들이 언급했듯이 쉽게 일치 할 수있는 명확한 패턴이 [currency] for [currency]입니다. 아래를 한번보십시오. 문서화가 잘되어 있습니다.

/** 
* Parse an amount with currency "[symbol (optional)][amount][postfix (optional)] [currency (optional)]" 
* @param {String} str Currency string e.g. "$100k dollars", "$100million", "100billion euro" 
* @return {Array}  See below 
*/ 
function parseCurrency(str) { 
    var match = /([^0-9\.]+)?([0-9\.]+)(\w+)?(?:\s+(\w+))?/.exec(str); 

    if(!match) throw new Error("Bad currency input: " + str); 

    var symbol = match[1], // €, $, £ 
     amount = match[2], // 100, 200 
     factor = match[3], // k, million i.e. 100k, 100million 
     unit = match[4] // euro, pound 

    return [symbol, amount, factor, unit]; 
} 

/** 
* Takes in a rate in the form of "[currency] for [currency]" 
* @param {String} str "[currency] for [currency]" 
* @return {Float}  Rate float 
*/ 
function parseRate(str) { 
    // Split and parse the currencies 
    var currencies = str.split("for").map(function(amount) { 
     return parseCurrency(amount.trim()); 
    }); 

    // Calculate the rate 
    // put the "for [currency]" over the "[currency] for" 
    var base = expandPostfix(currencies[0][1], currencies[0][2]), 
     exchangeTo = expandPostfix(currencies[1][1], currencies[1][2]); 

    return base/exchangeTo; 
} 

/** 
* Expand a number postfix 
* @param {Number} num  
* @param {String} postfix Postfix such as "k", "m", "billion" 
* @return {Number}   Expanded number 
*/ 
function expandPostfix(num, postfix) { 
    return num * (({ 
     k : 1000, 
     m: 1000000, 
     million: 1000000 
    })[postfix] || 1); 
} 

parseRate("1 euro for 3 pound"); // 0.333 
parseRate("10000 something for ∫1"); // 10000 
parseRate("1200 Something for ∫0.1"); // 12000 
관련 문제