public void TestSpanishParser() { var config = new SpanishNumberParserConfiguration(new BaseNumberOptionsConfiguration(Culture.Spanish, NumberOptions.None)); IParser parserNumber = AgnosticNumberParserFactory.GetParser(AgnosticNumberParserType.Number, config); IParser parserCardinal = AgnosticNumberParserFactory.GetParser(AgnosticNumberParserType.Cardinal, config); IParser parserPercentage = AgnosticNumberParserFactory.GetParser(AgnosticNumberParserType.Percentage, config); Assert.IsTrue(parserNumber is BaseNumberParser); Assert.IsTrue(parserCardinal is BaseNumberParser); Assert.IsTrue(parserPercentage is BasePercentageParser); }
public void TestPercentageModel() { var ci = new SpanishNumberParserConfiguration().CultureInfo; var model = NumberRecognizer.Instance.GetPercentageModel(Culture.Spanish);; #region Integer percentages BasicTest(model, "100%", "100%"); BasicTest(model, " 100% ", "100%"); BasicTest(model, " 100 por ciento", "100%"); BasicTest(model, " cien por cien", "100%"); BasicTest(model, "cien por ciento", "100%"); BasicTest(model, "243 por ciento", "243%"); BasicTest(model, "veinte por ciento", "20%"); BasicTest(model, "treinta y cinco por ciento", "35%"); BasicTest(model, "quinientos treinta y cinco por ciento", "535%"); BasicTest(model, "10 por ciento", "10%"); BasicTest(model, "diez por ciento", "10%"); BasicTest(model, "tres millones cincuenta y dos mil trescientos cuarenta y siete por ciento", "3052347%"); BasicTest(model, "tres millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete por ciento", "3452347%"); BasicTest(model, "trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete por ciento", "13452347%"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete por ciento", "513452347%"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta por ciento", "513452340%"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos por ciento", "513452300%"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil por ciento", "513452000%"); // a little percentage :p BasicTest(model, "tres billones cuatrocientos cincuenta y cinco mil doscientos veintiocho millones quinientos cincuenta y seis mil ochocientos treinta y dos por ciento", "3455228556832%"); // percentages within sentences BasicTest(model, "algo asi como un 11%", "11%", "11%"); BasicTest(model, "claro, solamente un 15 por ciento", "15%", "15 por ciento"); BasicTest(model, "si, nada mas un veinticinco por ciento", "25%", "veinticinco por ciento"); BasicTest(model, "todo, dejame el cien por cien del combustible", "100%", "cien por cien"); BasicTest(model, "un porcentaje del 25%", "25%", "25%"); BasicTest(model, "un porcentaje del treinta y seis por ciento del total", "36%", "treinta y seis por ciento"); BasicTest(model, "un porcentaje del ochenta y cuatro por cien solamente", "84%", "ochenta y cuatro por cien"); #endregion #region Double percentages BasicTest(model, " 101231,2353%", "101231,2353%"); BasicTest(model, "-101231,4323%", "-101231,4323%"); BasicTest(model, " -89101231,5127 por ciento", "-89101231,5127%"); BasicTest(model, " -1,1234567 por cien", "-1,1234567%"); BasicTest(model, "1.234.567,51274 por ciento", "1234567,51274%"); BasicTest(model, ",23456000%", "0,23456%"); BasicTest(model, "4,800%", "4,8%"); BasicTest(model, ",08 por ciento", "0,08%"); BasicTest(model, "9,2321312%", "9,2321312%"); BasicTest(model, " -9,2321312 por cien", "-9,2321312%"); BasicTest(model, "1e10%", "10000000000%"); BasicTest(model, "1,1^23 por ciento", "8,95430243255239%"); BasicTest(model, "siete con cincuenta por ciento", "7,5%"); BasicTest(model, "cuarenta y siete coma veintiocho por ciento", "47,28%"); BasicTest(model, "trescientos cuarenta y siete con quinientos doce por ciento", "347,512%"); BasicTest(model, "dos mil trescientos cuarenta y siete coma mil quinientos setenta y ocho por ciento", "2347,1578%"); BasicTest(model, "cincuenta y dos mil trescientos cuarenta y siete con doscientos por ciento", "52347,2%"); BasicTest(model, "cuatrocientos cincuenta y dos mil trescientos cuarenta y siete coma veintidos por ciento", "452347,22%"); #endregion #region Fraction percentages BasicTest(model, "tres quintos por ciento", ((double)3 / 5).ToString(ci) + "%"); BasicTest(model, "dos coma cinco por ciento", "2,5%"); BasicTest(model, "un quinto por ciento", "0,2%"); BasicTest(model, "un billonesimo por cien", "1E-12%"); BasicTest(model, "un veintiunavo por ciento", ((double)1 / 21).ToString(ci) + "%"); BasicTest(model, "ciento treinta y tres veintiunavos por ciento", ((double)133 / 21).ToString(ci) + "%"); BasicTest(model, "ciento treinta con tres veintiunavos por ciento", (130 + (double)3 / 21).ToString(ci) + "%"); BasicTest(model, "veintidos treintavos por ciento", ((double)22 / 30).ToString(ci) + "%"); BasicTest(model, "tres dosmilesimos por ciento", ((double)3 / 2000).ToString(ci) + "%"); BasicTest(model, "tres veintemilesimos por ciento", ((double)3 / 20000).ToString(ci) + "%"); // act like Google BasicTest(model, "ciento treinta quintos por ciento", ((double)130 / 5).ToString(ci) + "%"); BasicTest(model, "cien treintaicincoavos por ciento", ((double)100 / 35).ToString(ci) + "%"); // this is spanish can be interpreted as 130 + 2/5 or 132 / 5 - in this case go for 2nd option for simplicity BasicTest(model, "ciento treinta y dos cincoavos por ciento", ((double)132 / 5).ToString(ci) + "%"); // and we go for the first option if the user writes it using 'con' BasicTest(model, "ciento treinta con dos cincoavos por ciento", (130 + (double)2 / 5).ToString(ci) + "%"); BasicTest(model, "ciento treinta y dos quintos por ciento", ((double)132 / 5).ToString(ci) + "%"); BasicTest(model, "ciento treinta con dos quintos por ciento", (130 + (double)2 / 5).ToString(ci) + "%"); BasicTest(model, "uno sobre tres por ciento", ((double)1 / 3).ToString(ci) + "%"); BasicTest(model, "1 sobre 3 por ciento", ((double)1 / 3).ToString(ci) + "%"); BasicTest(model, "3/4%", ((double)3 / 4).ToString(ci) + "%"); BasicTest(model, "2/3%", ((double)2 / 3).ToString(ci) + "%"); #endregion }
public void TestFractionModel() { var ci = new SpanishNumberParserConfiguration().CultureInfo; var model = NumberRecognizer.Instance.GetNumberModel(Culture.Spanish); BasicTest(model, "un quinto", "0,2"); BasicTest(model, "un billonesimo", "1E-12"); BasicTest(model, "cien mil billonesima", "1E-07"); BasicTest(model, "tres quintos", "0,6"); BasicTest(model, "veinte quintos", "4"); BasicTest(model, "veintitres quintas", "4,6"); BasicTest(model, "tres con un quinto", "3,2"); BasicTest(model, "veintiun quintos", "4,2"); BasicTest(model, "un veintiunavo", ((double)1 / 21).ToString(ci)); BasicTest(model, "ciento treinta y tres veintiunavos", ((double)133 / 21).ToString(ci)); BasicTest(model, "ciento treinta con tres veintiunavos", (130 + (double)3 / 21).ToString(ci)); BasicTest(model, "veintidos treintavos", ((double)22 / 30).ToString(ci)); BasicTest(model, "un veinticincoavo", ((double)1 / 25).ToString(ci)); BasicTest(model, "veinte veinticincoavos", "0,8"); BasicTest(model, "tres veintiunavos", ((double)3 / 21).ToString(ci)); BasicTest(model, "tres veinteavos", ((double)3 / 20).ToString(ci)); BasicTest(model, "tres doscientosavos", ((double)3 / 200).ToString(ci)); BasicTest(model, "tres dosmilesimos", ((double)3 / 2000).ToString(ci)); BasicTest(model, "tres veintemilesimos", ((double)3 / 20000).ToString(ci)); BasicTest(model, "tres doscientosmilesimos", ((double)3 / 200000).ToString(ci)); BasicTest(model, "tres dosmillonesimos", ((double)3 / 2000000).ToString(ci)); // act like Google BasicTest(model, "ciento treinta quintos", ((double)130 / 5).ToString(ci)); BasicTest(model, "cien treintaicincoavos", ((double)100 / 35).ToString(ci)); // this is spanish can be interpreted as 130 + 2/5 or 132 / 5 - in this case go for 2nd option for simplicity BasicTest(model, "ciento treinta y dos cincoavos", ((double)132 / 5).ToString(ci)); // and we go for the first option if the user writes it using 'con' BasicTest(model, "ciento treinta con dos cincoavos", (130 + (double)2 / 5).ToString(ci)); BasicTest(model, "ciento treinta y dos quintos", ((double)132 / 5).ToString(ci)); BasicTest(model, "ciento treinta con dos quintos", (130 + (double)2 / 5).ToString(ci)); BasicTest(model, "un cientocincoavos", ((double)1 / 105).ToString(ci)); BasicTest(model, "cien milcincoavos", ((double)100 / 1005).ToString(ci)); BasicTest(model, "uno sobre tres", ((double)1 / 3).ToString(ci)); BasicTest(model, "1 sobre 21", ((double)1 / 21).ToString(ci)); BasicTest(model, "1 sobre tres", ((double)1 / 3).ToString(ci)); BasicTest(model, "1 sobre 3", ((double)1 / 3).ToString(ci)); BasicTest(model, "uno sobre 3", ((double)1 / 3).ToString(ci)); BasicTest(model, "uno sobre 20", ((double)1 / 20).ToString(ci)); BasicTest(model, "uno sobre veinte", ((double)1 / 20).ToString(ci)); BasicTest(model, "uno sobre cien", ((double)1 / 100).ToString(ci)); BasicTest(model, "1 sobre ciento veintiuno", ((double)1 / 121).ToString(ci)); BasicTest(model, "uno sobre ciento treinta y cinco", ((double)1 / 135).ToString(ci)); BasicTest(model, "cinco medios", ((double)5 / 2).ToString(ci)); BasicTest(model, "tres cuartos", ((double)3 / 4).ToString(ci)); BasicTest(model, "dos tercios", ((double)2 / 3).ToString(ci)); BasicTest(model, "ciento treinta y cinco medios", ((double)135 / 2).ToString(ci)); // not supported should be written as integer + decimal part => once con uno y medio //BasicTest(model, "diez con tres medios", (10 + (double)3 / 2).ToString(ci)); BasicTest(model, "once con uno y medio", (10 + (double)3 / 2).ToString(ci)); BasicTest(model, "diez con un medio", (10 + (double)1 / 2).ToString(ci)); BasicTest(model, "diez con un cuarto", (10 + (double)1 / 4).ToString(ci)); }
public void TestNumberModel() { var ci = new SpanishNumberParserConfiguration().CultureInfo; var model = NumberRecognizer.Instance.GetNumberModel(Culture.Spanish); #region Integer numbers BasicTest(model, "2 mil millones", "2000000000"); BasicTest(model, " 123456789101231", "123456789101231"); BasicTest(model, "-123456789101231", "-123456789101231"); BasicTest(model, " -123456789101231", "-123456789101231"); BasicTest(model, " -1", "-1"); BasicTest(model, "1.234.567", "1234567"); BasicTest(model, "3 docenas", "36"); BasicTest(model, "dos mil millones", "2000000000"); BasicTest(model, "una docena", "12"); BasicTest(model, "quince docenas", "180"); BasicTest(model, "dos mil y cuatro docenas", "2048"); BasicTest(model, "siete", "7"); BasicTest(model, "cuarenta y siete", "47"); BasicTest(model, "trescientos cuarenta y siete", "347"); BasicTest(model, "dos mil trescientos cuarenta y siete", "2347"); BasicTest(model, "cincuenta y dos mil trescientos cuarenta y siete", "52347"); BasicTest(model, "cuatrocientos cincuenta y dos mil trescientos cuarenta y siete", "452347"); BasicTest(model, "tres millones", "3000000"); BasicTest(model, "tres millones siete", "3000007"); BasicTest(model, "tres millones cuarenta y siete", "3000047"); BasicTest(model, "tres millones trescientos cuarenta y siete", "3000347"); BasicTest(model, "tres millones dos mil trescientos cuarenta y siete", "3002347"); BasicTest(model, "tres millones cincuenta y dos mil trescientos cuarenta y siete", "3052347"); BasicTest(model, "tres millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete", "3452347"); BasicTest(model, "trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete", "13452347"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete", "513452347"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta", "513452340"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil trescientos", "513452300"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta y dos mil", "513452000"); BasicTest(model, "quinientos trece millones cuatrocientos cincuenta mil", "513450000"); BasicTest(model, "quinientos trece millones cuatrocientos mil", "513400000"); BasicTest(model, "quinientos trece millones", "513000000"); BasicTest(model, "quinientos diez millones", "510000000"); BasicTest(model, "quinientos millones", "500000000"); BasicTest(model, "mil quinientos veintitres", "1523"); // a little number :p BasicTest(model, "tres billones cuatrocientos cincuenta y cinco mil doscientos veintiocho millones quinientos cincuenta y seis mil ochocientos treinta y dos", "3455228556832"); BasicTest(model, "tres billones cuatrocientos cincuenta y cinco mil doscientos veintiocho millones quinientos cincuenta y seis mil", "3455228556000"); BasicTest(model, "tres billones cuatrocientos cincuenta y cinco mil doscientos veintiocho millones", "3455228000000"); BasicTest(model, "tres billones cuatrocientos cincuenta y cinco mil millones", "3455000000000"); BasicTest(model, "tres billones", "3000000000000"); // super number :p - supported by extractor but not by parser //BasicTest(GetOrdinalModel(), "ciento sesenta y tres septillones quinientos ochenta y dos mil ochocientos setenta y un sextillones ciento dieciocho mil novecientos trece quintillones quinientos ochenta y cinco mil trescientos cuarenta y seis cuatrillones novecientos noventa y siete mil doscientos setenta y tres trillones cuatrocientos treinta y cuatro mil trescientos veinticinco billones quinientos cincuenta y cinco mil ochocientos veintiún millones novecientos cincuenta y tres mil seiscientos setenta y cinco", "163582871118913585346997273434325555821953675"); // numbers within sentences BasicTest(model, "dame un mil", "1000", "un mil"); BasicTest(model, "tirate un paso", "1", "un"); BasicTest(model, "voy a comprar solo una vaca", "1", "una"); BasicTest(model, "voy a comprar doscientas vacas", "200", "doscientas"); BasicTest(model, "tengo solamente mil cien pesos", "1100", "mil cien"); BasicTest(model, "tengo solamente siete mil doscientos treinta y cinco pesos", "7235", "siete mil doscientos treinta y cinco"); BasicTest(model, "no mucho, creo que voy a gastar algo asi como trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete bolivares en todo el proyecto", "13452347", "trece millones cuatrocientos cincuenta y dos mil trescientos cuarenta y siete"); #endregion #region Double numbers BasicTest(model, " 101231,2353", "101231,2353"); BasicTest(model, "-101231,4323", "-101231,4323"); BasicTest(model, " -89101231,5127", "-89101231,5127"); BasicTest(model, " -1,1234567", "-1,1234567"); BasicTest(model, "1.234.567,51274", "1234567,51274"); BasicTest(model, "192,", "192", "192"); BasicTest(model, ",23456000", "0,23456"); BasicTest(model, "4,800", "4,8"); BasicTest(model, ",08", "0,08"); BasicTest(model, "9,2321312", "9,2321312"); BasicTest(model, " -9,2321312", "-9,2321312"); BasicTest(model, "1e10", "10000000000"); BasicTest(model, "1,1^23", "8,95430243255239"); BasicTest(model, "siete con cincuenta", "7,5"); BasicTest(model, "cuarenta y siete coma veintiocho", "47,28"); BasicTest(model, "trescientos cuarenta y siete con quinientos doce", "347,512"); BasicTest(model, "dos mil trescientos cuarenta y siete coma mil quinientos setenta y ocho", "2347,1578"); BasicTest(model, "cincuenta y dos mil trescientos cuarenta y siete con doscientos", "52347,2"); BasicTest(model, "cuatrocientos cincuenta y dos mil trescientos cuarenta y siete coma veintidos", "452347,22"); BasicTest(model, "1,1^+23", "8,95430243255239"); BasicTest(model, "2,5^-1", "0,4"); BasicTest(model, "-2500^-1", "-0,0004"); BasicTest(model, "-1,1^+23", "-8,95430243255239"); BasicTest(model, "-2,5^-1", "-0,4"); BasicTest(model, "-1,1^--23", "-8,95430243255239"); BasicTest(model, "-127,32e13", "-1,2732E+15"); BasicTest(model, "12,32e+14", "1,232E+15"); BasicTest(model, "-12e-1", "-1,2"); #endregion #region Translated numbers from english BasicTest(model, "192.", "192", "192"); // '.' is group separator in spanish - so not understood as IP MultiTest(model, "192.168.1.2", 3); //this will be supported for the NumberWithUnitModel MultiTest(model, "son 180,25ml liquidos", 0); MultiTest(model, "son 180ml liquidos", 0); MultiTest(model, " 29km caminando ", 0); MultiTest(model, " subamos al 4to piso ", 0); MultiTest(model, "son ,25ml liquidos", 0); BasicTest(model, ",08", "0,08"); MultiTest(model, "uno", 1); MultiTest(model, "un", 1); BasicTest(model, ",23456000", "0,23456"); BasicTest(model, "4,800", "4,8"); BasicTest(model, "ciento tres con dos tercios", (103 + (double)2 / 3).ToString(ci)); BasicTest(model, "dieciseis", "16"); BasicTest(model, "dos tercios", ((double)2 / 3).ToString(ci)); BasicTest(model, "ciento dieciseis", "116"); BasicTest(model, "ciento seis", "106"); BasicTest(model, "ciento sesenta y un", "161"); BasicTest(model, "un billonesimo", "1E-12"); BasicTest(model, "cien billonesimos", "1E-10"); BasicTest(model, " media docena ", "6"); BasicTest(model, " 3 docenas", "36"); BasicTest(model, "una docena", "12"); BasicTest(model, " tres docenas ", "36"); BasicTest(model, "1.234.567", "1234567"); MultiTest(model, "1. 234. 567", 3); BasicTest(model, "9,2321312", "9,2321312"); BasicTest(model, " -9,2321312", "-9,2321312"); BasicTest(model, " -1", "-1"); BasicTest(model, "-4/5", "-0,8"); BasicTest(model, "- 1 4/5", "-1,8"); BasicTest(model, "tres", "3"); BasicTest(model, " 123456789101231", "123456789101231"); BasicTest(model, "-123456789101231", "-123456789101231"); BasicTest(model, " -123456789101231", "-123456789101231"); BasicTest(model, "1", "1"); BasicTest(model, "10k", "10000"); BasicTest(model, "10G", "10000000000"); BasicTest(model, "- 10 k", "-10000"); BasicTest(model, "2 millones", "2000000"); BasicTest(model, "1 billon", "1000000000000"); BasicTest(model, " tres ", "3"); BasicTest(model, "un billon", "1000000000000"); BasicTest(model, "veintiun billones", "21000000000000"); BasicTest(model, "veintiun billones trescientos", "21000000000300"); BasicTest(model, "cincuenta y dos", "52"); BasicTest(model, "trescientos treinta y uno", "331"); BasicTest(model, "doscientos dos mil", "202000"); BasicTest(model, "dos mil doscientos", "2200"); BasicTest(model, " 2,33 k", "2330"); BasicTest(model, " doscientos coma cero tres", "200,03"); BasicTest(model, " doscientos con setenta y uno", "200,71"); BasicTest(model, "1e10", "10000000000"); BasicTest(model, "1,1^23", "8,95430243255239"); BasicTest(model, " 322 millones ", "322000000"); BasicTest(model, "setenta", "70"); BasicTest(model, "cincuenta y dos", "52"); BasicTest(model, "2 1/4", "2,25"); BasicTest(model, "3/4", "0,75"); BasicTest(model, "un octavo", "0,125"); BasicTest(model, "cinco octavos", "0,625"); BasicTest(model, "un medio", "0,5"); BasicTest(model, "tres cuartos", "0,75"); BasicTest(model, "veinte con tres quintos", "20,6"); BasicTest(model, "veintitres quintos", "4,6"); BasicTest(model, "veintitres con tres quintos", "23,6"); BasicTest(model, "un millon dos mil doscientos tres quintos", "200440,6"); BasicTest(model, "uno con un medio", "1,5"); BasicTest(model, "uno con un cuarto", "1,25"); BasicTest(model, "cinco con un cuarto", "5,25"); BasicTest(model, "cien con tres cuartos", "100,75"); BasicTest(model, "un centesimo", "0,01"); #endregion }