1

私は実際に2つの質問があります。最初に、テキスト (例: One) を実際の数値 (1) に変換し、プラスを + に変換する方法を教えてください。私は計算で始まるスピーチを取り、そのスピーチ内で数学を実行しようとしています。しかし、何らかの理由で、音声認識は (1+3) ではなく、数字と記号をテキスト (1 + 3) で書き留めます。

もう 1 つの問題は、sin、cos 積分、およびすべてのレベルの数学のような重い数学方程式を実行する API またはライブラリです。解決策に到達するために実行したプロセスを示します。

4

1 に答える 1

1

あなたが求めていることは特に難しいことではありませんが、複雑さが増すにつれて難しくなります。どれだけ理解する必要があるかによって、これは非常に複雑になる場合があります。ただし、単純なnumber plus numberornumber minus numberの場合、かなり簡単です。開始するには、次のコードでこれら 2 つのシナリオを処理できます。お好みで自由に広げてみてください。また、最小限のエラー チェックがあることにも注意してください。実稼働システムでは、かなり多くのエラー チェックが必要になります。

import java.util.Map;
import java.util.HashMap;

public class Nums {
    private static Map<String, Integer> nums = new HashMap<String, Integer>();
    public static void main(String[] args) {
        nums.put("zero", 0);
        nums.put("one", 1);
        nums.put("two", 2);
        nums.put("three", 3);
        nums.put("four", 4);
        nums.put("five", 5);
        nums.put("six", 6);
        nums.put("seven", 7);
        nums.put("eight", 8);
        nums.put("nine", 9);
        nums.put("ten", 10);
        nums.put("eleven", 11);
        nums.put("twelve", 12);
        nums.put("thirteen", 13);
        nums.put("fourteen", 14);
        nums.put("fifteen", 15);
        nums.put("sixteen", 16);
        nums.put("seventeen", 17);
        nums.put("eighteen", 18);
        nums.put("nineteen", 19);
        nums.put("twenty", 20);
        nums.put("thirty", 30);
        nums.put("forty", 40);
        nums.put("fifty", 50);
        nums.put("sixty", 60);
        nums.put("seventy", 70);
        nums.put("eighty", 80);
        nums.put("ninety", 90);


        String input = args[0].toLowerCase();

        int pos;
        String num1, num2;
        int res1, res2;
        if((pos = input.indexOf(" plus ")) != -1) {
            num1 = input.substring(0, pos);
            num2 = input.substring(pos + 6);

            res1 = getNumber(num1);
            res2 = getNumber(num2);
            System.out.println(args[0] + "   =>   " + res1 + " + " + res2 + " = " + (res1 + res2));
        }
        else if((pos = input.indexOf(" minus ")) != -1) {
            num1 = input.substring(0, pos);
            num2 = input.substring(pos + 7);

            res1 = getNumber(num1);
            res2 = getNumber(num2);
            System.out.println(args[0] + "   =>   " + res1 + " - " + res2 + " = " + (res1 - res2));
        }
        else {
            System.out.println(args[0] + "   =>   " + getNumber(args[0]));
        }
    }

    private static int getNumber(String input) {
        String[] parts = input.split(" +");
        int number = 0;
        int mult = 1;
        String fact;

        for(int i=parts.length-1; i>=0; i--) {
            parts[i] = parts[i].toLowerCase();
            if(parts[i].equals("hundreds") || parts[i].equals("hundred")) {
                mult *= 100;
            }
            else if(parts[i].equals("thousands") || parts[i].equals("thousand")) {
                if(number >= 1000) {
                    throw new NumberFormatException("Invalid input (part " + (i + 1) + ")");
                }
                mult = 1000;
            }
            else if(parts[i].equals("millions") || parts[i].equals("million")) {
                if(number >= 1000000) {
                    throw new NumberFormatException("Invalid input (part " + (i + 1) + ")");
                }
                mult = 1000000;
            }
            else if(!nums.containsKey(parts[i])) {
                throw new NumberFormatException("Invalid input (part " + (i + 1) + ")");
            }
            else {           
                number += mult * nums.get(parts[i]);
            }
        }

        if(!nums.containsKey(parts[0])) {
            number += mult;
        }

        return number;
    }
}

このコードは、0 から 999,999,999 までの数値を処理し、負の数値は処理しません。繰り返しますが、範囲を広げたり、負の数を処理したりするために拡張することはそれほど難しくありません。integer数十億を処理するように拡張する場合は、結果を保持するためにlong変数に切り替える必要がある場合があることに注意してください。

いくつかのテスト実行を次に示します。

$ java Nums "three hundred nineteen million five hundred twenty three thousand six hundred eighteen"
three hundred nineteen million five hundred twenty three thousand six hundred eighteen   =>   319523618
$ java Nums "five hundred minus three hundred ninety nine"
five hundred minus three hundred ninety nine   =>   500 - 399 = 101
$ java Nums "thirty three plus seventeen"
thirty three plus seventeen   =>   33 + 17 = 50
$ java Nums zero
zero   =>   0
$ java Nums "one plus three"
one plus three   =>   1 + 3 = 4
$ java Nums "hundred thousand"
hundred thousand   =>   100000
$ java Nums "hundred thousand minus ten thousand"
hundred thousand minus ten thousand   =>   100000 - 10000 = 90000
于 2013-06-11T14:46:13.453 に答える