解释句子并转换成相应的格式

时间:2014-06-14 09:00:19

标签: java regex string algorithm nlp

有一些输入格式及其相应的输出

1. 7 years 10 months  ---> YRS:7 MNHS:10
2. 7 kgs 10 grms      ---> KGS:7 GRMS:10
3. 7 kilograms 10 grams  ---> KGS:7 GRMS:10
4. 7 thousand 9 hundread ---> 7900
5. seven years ten months --> YRS:7 MNHS:10 
6. seven kgs ten grms     ---> KGS:7 GRMS:10
7. triple seven double five  --> 77755

我通过在** HashMap 中存储信息为所有人编写了单独的模块。它工作正常。**

然后我需要编写一个主模块,其中输入是一个句子(话语),我需要将所有上面的子串替换为相应的子串输出。

例如

输入: - 拨号三联八联三有三九八。

输出: - 拨号号码888444398。

和许多这样的话语。

我的疑惑:

  1. 我使用了较小模块的HashMap数来存储键的含义,就像 - 三重意味着3次,双重意味着2次全部。但这有限制,如果我需要添加任何东西,我必须在HashMap中添加该条目。 为此建议一些好的技巧。

  2. 我在主模块中感到困惑,如何从给定的话语中提取上面例子中给出的有用子字符串。 所以也建议一些好的技巧。

  3. Project Lanuguage:Java。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您可能想要使用某种formal grammar parser。只是设计语法可以清除问题的视图。在最简单的情况下,您的语法可能如下所示:

    STRING -> "" | STRING MEASUREMENT | STRING NUMBER | STRING WORD
    MEASUREMENT -> NUMBER UNITS
    UNITS -> kgs | grms | years | months | ...
    NUMBER -> THOUSAND HUNDRED NUMBER_BELOW_HUNDRED | THOUSAND HUNDRED
    THOUSAND -> "" | NUMBER_BELOW_HUNDRED thousand
    HUNDRED -> "" | NUMBER_BELOW_HUNDRED hundred
    NUMBER_BELOW_HUNDRED -> one | two | three | ... | ninety nine | 99 | 98 | ... | 1
    WORD -> /* all other */

您可以自己编写解析器(在这种情况下看起来非常简单)或使用像Bison / Flex这样的现成解决方案。

HashMaps的常用替代方法是configuration files