سؤال

كما نعلم جميعا أن الأرقام يمكن أن تكون مكتوبة إما في العددية ، أو تسمى بمسمياتها.في حين أن هناك الكثير من الأمثلة التي يمكن العثور عليها التي تحول 123 إلى مائة وعشرين ثلاث, أنا لا يمكن العثور على أمثلة جيدة على كيفية تحويل طريقة أخرى.

بعض المحاذير:

  1. الكاردينال/الاسمي أو الترتيبية:"واحد" و "أول مرة"
  2. المشتركة الأخطاء الإملائية:"أربعين"/"أربعون"
  3. مئات/آلاف:2100 -> "عشرين ومائة" و أيضا "من ألفي ومائة"
  4. الفواصل:"أحد عشر مائة وخمسين اثنين" ، ولكن أيضا "elevenhundred fiftytwo" أو "أحد عشر مائة وخمسين اثنين" وغيرها
  5. العامية:"والثلاثين شيء"
  6. الكسور:'ثلث', 'خمسي'
  7. الأسماء الشائعة:'عشرة', 'نصف'

و هناك ربما أكثر من المحاذير المحتملة التي لم تدرج بعد.لنفترض الخوارزمية يجب أن تكون قوية جدا ، وحتى نفهم الأخطاء الإملائية.

ما المجالات/أوراق/دراسات/الخوارزميات يجب قراءة لمعرفة كيفية كتابة كل هذا ؟ أين هذه المعلومات ؟

PS:قراري النهائي محلل أن فهم الواقع 3 لغات مختلفة, الإنجليزية, الروسية و العبرية.وربما في مرحلة لاحقة سيتم إضافة المزيد من اللغات.العبرية أيضا ذكر/أنثى أرقام مثل "رجل واحد" و "امرأة واحدة" مختلفة "واحد" — "ehad" و "ahat".الروسية أيضا بعض من تعقيداتها الخاصة بها.

جوجل يقوم بعمل كبير في هذا.على سبيل المثال:

http://www.google.com/search?q=two+thousand+and+one+hundred+plus+five+dozen+and+four+fifths+in+decimal

(والعكس أيضا ممكن ، http://www.google.com/search?q=999999999999+in+english)

هل كانت مفيدة؟

المحلول

كنت اللعب حولها مع ربط محلل أن تفعل ما تريد (و قد نشر أن إجابة منفصلة في وقت لاحق) عندما لاحظت أن هناك خوارزمية بسيطة جدا لا بشكل ملحوظ بعمل جيد مع الأشكال الشائعة من الأرقام في اللغة الإنجليزية, الأسبانية, الألمانية, على الأقل.

العمل مع اللغة الإنجليزية على سبيل المثال ، تحتاج القاموس الذي خرائط الكلمات القيم في طريقة واضحة:

"one" -> 1, "two" -> 2, ... "twenty" -> 20,
"dozen" -> 12, "score" -> 20, ...
"hundred" -> 100, "thousand" -> 1000, "million" -> 1000000

...وهكذا دواليك

الخوارزمية هي فقط:

total = 0
prior = null
for each word w
    v <- value(w) or next if no value defined
    prior <- case
        when prior is null:       v
        when prior > v:     prior+v
        else                prior*v
        else
    if w in {thousand,million,billion,trillion...}
        total <- total + prior
        prior <- null
total = total + prior unless prior is null

على سبيل المثال, هذا تقدم على النحو التالي:

total    prior      v     unconsumed string
    0      _              four score and seven 
                    4     score and seven 
    0      4              
                   20     and seven 
    0     80      
                    _     seven 
    0     80      
                    7 
    0     87      
   87

total    prior      v     unconsumed string
    0        _            two million four hundred twelve thousand eight hundred seven
                    2     million four hundred twelve thousand eight hundred seven
    0        2
                  1000000 four hundred twelve thousand eight hundred seven
2000000      _
                    4     hundred twelve thousand eight hundred seven
2000000      4
                    100   twelve thousand eight hundred seven
2000000    400
                    12    thousand eight hundred seven
2000000    412
                    1000  eight hundred seven
2000000  412000
                    1000  eight hundred seven
2412000     _
                      8   hundred seven
2412000     8
                     100  seven
2412000   800
                     7
2412000   807
2412807

وهلم جرا.أنا لا أقول أنها مثالية ، ولكن سريعة وقذرة يفعل بشكل جيد جدا.


معالجة محددة قائمة على تحرير:

  1. الكاردينال/الاسمي أو الترتيبية:"واحد" و "الأولى" -- مجرد وضعها في القاموس
  2. الإنجليزية/البريطانية:"أربعون"/"أربعين" -- كما سبق
  3. مئات/آلاف:2100 -> "عشرين ومائة" و أيضا "من ألفي ومائة" -- يعمل كما هو
  4. الفواصل:"أحد عشر مائة وخمسين اثنين" ، ولكن أيضا "elevenhundred fiftytwo" أو "أحد عشر مائة وخمسين اثنين" وغيرها -- مجرد تحديد "الكلمة التالية" أن يكون أطول البادئة يطابق تعريف كلمة ، أو إلى غير كلمة إذا لم تفعل ، لتبدأ
  5. colloqialisms:"والثلاثين شيء" -- يعمل
  6. شظايا:'ثلث', 'خمسي' -- ليس بعد...
  7. الأسماء الشائعة:'عشرة', 'نصف' -- يعمل ؛ حتى يمكنك أن تفعل أشياء مثل "نصف دستة"

رقم 6 هو واحد فقط ليس لدي إجابة جاهزة ، وذلك بسبب غموض بين الترتيبية و الكسور (في اللغة الإنجليزية على الأقل) إضافة إلى حقيقة أن آخر كأس من القهوة العديد من قبل ساعات.

نصائح أخرى

انها ليست مسألة سهلة ، وأنا أعرف من أي مكتبة أن تفعل ذلك.قد تجلس و أحاول أن أكتب شيئا من هذا القبيل في وقت ما.أود أن تفعل ذلك في أي حاسوب, جافا أو هاسكل, على الرغم من.بقدر ما أستطيع أن أرى ، هناك العديد من القضايا:

  • عملية تحويل البيانات إلى رموز:في بعض الأحيان, أرقام مكتوبة عشر مائة وخمسون اثنان, ولكن رأيت elevenhundred fiftytwo أو الحادية عشرة-مائة-اثنين وخمسين وغيرها.واحد من شأنه أن إجراء مسح على ما يشكل فعلا في الاستخدام.هذه قد تكون صعبة وخاصة العبرية.
  • الأخطاء الإملائية:هذا ليس من الصعب جدا.لديك كمية محدودة من الكلمات ، و قليلا من Levenshtein-المسافة السحر ينبغي أن تفعل خدعة.
  • أشكال بديلة ، مثل هل سبق ذكره ، موجودة.ويشمل هذا ترتيبي/أرقام الكاردينال ، فضلا عن أربعين/و أربعون و...
  • ...الأسماء شيوعا أو استخداما والعبارات NEs (الكيانات اسمه).هل تريد استخراج 30 من حرب الثلاثين عاما أو 2 من الحرب العالمية الثانية ؟
  • الأرقام الرومانية أيضا ؟
  • Colloqialisms ، مثل "ثلاثين عاما" و "ثلاثة اليورو و شظايا" الذي لا أعرف كيفية علاج.

إذا كنت مهتما في هذا يمكنني إعطائها بالرصاص في نهاية هذا الاسبوع.فكرتي هي على الأرجح باستخدام UIMA و tokenizing مع ذلك ، ثم تسير إلى مزيد من tokenize/إزالة الغموض و أخيرا ترجمة.قد يكون هناك المزيد من القضايا, دعونا نرى إذا كنت يمكن أن تأتي مع بعض من الأشياء أكثر إثارة للاهتمام.

آسف هذه ليست إجابة حقيقية بعد مجرد امتداد على سؤالك.أنا سوف تتيح لك معرفة إذا كنت تجد/أكتب شيئا.

بالمناسبة, إذا كنت مهتما في دلالات الأرقام ، أنا فقط وجدت مثيرة للاهتمام الورق قبل Friederike Moltmann ، ومناقشة بعض القضايا المتعلقة منطق تفسير الأرقام.

لدي بعض التعليمات البرمجية كتبت قبل فترة: text2num.هذا بعض ما تريد ، إلا أنه لا التعامل مع الأعداد الترتيبية.في الواقع لم يستخدم هذا الرمز في أي شيء ، حتى انها لم تختبر إلى حد كبير!

استخدام بيثون نمط-ar المكتبة:

>>> from pattern.en import number
>>> number('two thousand fifty and a half') => 2050.5

يجب أن نأخذ في الاعتبار أن أوروبا وأمريكا الاعتماد بشكل مختلف.

الأوروبية الموحدة:

One Thousand
One Million
One Thousand Millions (British also use Milliard)
One Billion
One Thousand Billions
One Trillion
One Thousand Trillions

هنا هو صغير إشارة على ذلك.


طريقة بسيطة لمعرفة الفرق التالية:

(American counting Trillion) == (European counting Billion)

الأرقام الترتيبية غير قابلة للتطبيق لأنها لا يمكن أن يكون انضم بطرق ذات معنى مع أرقام أخرى في اللغة (على الأقل في اللغة الإنجليزية)

على سبيل المثالمائة الأول, الثاني عشر, الخ...

ومع ذلك ، هناك آخر الإنجليزية/الأمريكية التحذير مع كلمة 'و'

أي

مائة و واحد (باللغة الإنجليزية) مائة و واحد (أمريكا)

أيضا, استخدام " a " يعني في اللغة الإنجليزية

ألف = ألف

على الجانب علما جوجل آلة حاسبة تقوم بعمل مدهش من هذا.

مائة و ثلاثة آلاف أضعاف سرعة الضوء

و حتى...

ألفي ومائة بالإضافة إلى عشرات

...wtf?!? درجة زائد عشرة في الأرقام الرومانية

هنا هو قوية للغاية الحل في Clojure.

AFAIK انها فريدة من نوعها تنفيذ النهج.

;----------------------------------------------------------------------
; numbers.clj
; written by: Mike Mattie codermattie@gmail.com
;----------------------------------------------------------------------
(ns operator.numbers
  (:use compojure.core)

  (:require
    [clojure.string     :as string] ))

(def number-word-table {
  "zero"          0
  "one"           1
  "two"           2
  "three"         3
  "four"          4
  "five"          5
  "six"           6
  "seven"         7
  "eight"         8
  "nine"          9
  "ten"           10
  "eleven"        11
  "twelve"        12
  "thirteen"      13
  "fourteen"      14
  "fifteen"       15
  "sixteen"       16
  "seventeen"     17
  "eighteen"      18
  "nineteen"      19
  "twenty"        20
  "thirty"        30
  "fourty"        40
  "fifty"         50
  "sixty"         60
  "seventy"       70
  "eighty"        80
  "ninety"        90
})

(def multiplier-word-table {
  "hundred"       100
  "thousand"      1000
})

(defn sum-words-to-number [ words ]
  (apply + (map (fn [ word ] (number-word-table word)) words)) )

; are you down with the sickness ?
(defn words-to-number [ words ]
  (let
    [ n           (count words)

      multipliers (filter (fn [x] (not (false? x))) (map-indexed
                                                      (fn [ i word ]
                                                        (if (contains? multiplier-word-table word)
                                                          (vector i (multiplier-word-table word))
                                                          false))
                                                      words) )

      x           (ref 0) ]

    (loop [ indices (reverse (conj (reverse multipliers) (vector n 1)))
            left    0
            combine + ]
      (let
        [ right (first indices) ]

        (dosync (alter x combine (* (if (> (- (first right) left) 0)
                                      (sum-words-to-number (subvec words left (first right)))
                                      1)
                                    (second right)) ))

        (when (> (count (rest indices)) 0)
          (recur (rest indices) (inc (first right))
            (if (= (inc (first right)) (first (second indices)))
              *
              +))) ) )
    @x ))

وإليك بعض الأمثلة

(operator.numbers/words-to-number ["six" "thousand" "five" "hundred" "twenty" "two"])
(operator.numbers/words-to-number ["fifty" "seven" "hundred"])
(operator.numbers/words-to-number ["hundred"])

بلدي LPC تنفيذ بعض المتطلبات الخاصة بك (الإنجليزية الأمريكية فقط):

internal mapping inordinal = ([]);
internal mapping number = ([]);

#define Numbers ([\
    "zero"        : 0, \
    "one"         : 1, \
    "two"         : 2, \
    "three"       : 3, \
    "four"        : 4, \
    "five"        : 5, \
    "six"         : 6, \
    "seven"       : 7, \
    "eight"       : 8, \
    "nine"        : 9, \
    "ten"         : 10, \
    "eleven"      : 11, \
    "twelve"      : 12, \
    "thirteen"    : 13, \
    "fourteen"    : 14, \
    "fifteen"     : 15, \
    "sixteen"     : 16, \
    "seventeen"   : 17, \
    "eighteen"    : 18, \
    "nineteen"    : 19, \
    "twenty"      : 20, \
    "thirty"      : 30, \
    "forty"       : 40, \
    "fifty"       : 50, \
    "sixty"       : 60, \
    "seventy"     : 70, \
    "eighty"      : 80, \
    "ninety"      : 90, \
    "hundred"     : 100, \
    "thousand"    : 1000, \
    "million"     : 1000000, \
    "billion"     : 1000000000, \
])

#define Ordinals ([\
    "zeroth"        : 0, \
    "first"         : 1, \
    "second"        : 2, \
    "third"         : 3, \
    "fourth"        : 4, \
    "fifth"         : 5, \
    "sixth"         : 6, \
    "seventh"       : 7, \
    "eighth"        : 8, \
    "ninth"         : 9, \
    "tenth"         : 10, \
    "eleventh"      : 11, \
    "twelfth"       : 12, \
    "thirteenth"    : 13, \
    "fourteenth"    : 14, \
    "fifteenth"     : 15, \
    "sixteenth"     : 16, \
    "seventeenth"   : 17, \
    "eighteenth"    : 18, \
    "nineteenth"    : 19, \
    "twentieth"     : 20, \
    "thirtieth"     : 30, \
    "fortieth"      : 40, \
    "fiftieth"      : 50, \
    "sixtieth"      : 60, \
    "seventieth"    : 70, \
    "eightieth"     : 80, \
    "ninetieth"     : 90, \
    "hundredth"     : 100, \
    "thousandth"    : 1000, \
    "millionth"     : 1000000, \
    "billionth"     : 1000000000, \
])

varargs int denumerical(string num, status ordinal) {
    if(ordinal) {
        if(member(inordinal, num))
            return inordinal[num];
    } else {
        if(member(number, num))
            return number[num];
    }
    int sign = 1;
    int total = 0;
    int sub = 0;
    int value;
    string array parts = regexplode(num, " |-");
    if(sizeof(parts) >= 2 && parts[0] == "" && parts[1] == "-")
        sign = -1;
    for(int ix = 0, int iix = sizeof(parts); ix < iix; ix++) {
        string part = parts[ix];
        switch(part) {
        case "negative" :
        case "minus"    :
            sign = -1;
            continue;
        case ""         :
            continue;
        }
        if(ordinal && ix == iix - 1) {
            if(part[0] >= '0' && part[0] <= '9' && ends_with(part, "th"))
                value = to_int(part[..<3]);
            else if(member(Ordinals, part))
                value = Ordinals[part];
            else
                continue;
        } else {
            if(part[0] >= '0' && part[0] <= '9')
                value = to_int(part);
            else if(member(Numbers, part))
                value = Numbers[part];
            else
                continue;
        }
        if(value < 0) {
            sign = -1;
            value = - value;
        }
        if(value < 10) {
            if(sub >= 1000) {
                total += sub;
                sub = value;
            } else {
                sub += value;
            }
        } else if(value < 100) {
            if(sub < 10) {
                sub = 100 * sub + value;
            } else if(sub >= 1000) {
                total += sub;
                sub = value;
            } else {
                sub *= value;
            }
        } else if(value < sub) {
            total += sub;
            sub = value;
        } else if(sub == 0) {
            sub = value;
        } else {
            sub *= value;
        }
    }
    total += sub;
    return sign * total;
}

حسنا, لقد تأخرت في الإجابة عن هذا السؤال ، ولكن كنت أعمل اختبار قليلا السيناريو الذي يبدو أنه قد عملت بشكل جيد جدا بالنسبة لي.أنا استخدم (بسيطة ، ولكن القبيح ، كبيرة) التعبير العادي لتحديد موقع كل الكلمات بالنسبة لي.التعبير على النحو التالي:

(?<Value>(?:zero)|(?:one|first)|(?:two|second)|(?:three|third)|(?:four|fourth)|
(?:five|fifth)|(?:six|sixth)|(?:seven|seventh)|(?:eight|eighth)|(?:nine|ninth)|
(?:ten|tenth)|(?:eleven|eleventh)|(?:twelve|twelfth)|(?:thirteen|thirteenth)|
(?:fourteen|fourteenth)|(?:fifteen|fifteenth)|(?:sixteen|sixteenth)|
(?:seventeen|seventeenth)|(?:eighteen|eighteenth)|(?:nineteen|nineteenth)|
(?:twenty|twentieth)|(?:thirty|thirtieth)|(?:forty|fortieth)|(?:fifty|fiftieth)|
(?:sixty|sixtieth)|(?:seventy|seventieth)|(?:eighty|eightieth)|(?:ninety|ninetieth)|
(?<Magnitude>(?:hundred|hundredth)|(?:thousand|thousandth)|(?:million|millionth)|
(?:billion|billionth)))

يظهر هنا مع خط فواصل لتنسيق الأغراض..

على أي حال ، كانت طريقة لتنفيذ هذا RegEx مع مكتبة مثل PCRE ثم قراءة اسمه المباريات.وعملت على من الأمثلة المذكورة في هذا السؤال ناقص "نصف", أنواع, كما لم إضافتها ولكن كما ترى فإنه لن يكون من الصعب القيام بذلك.هذا يعالج الكثير من القضايا.على سبيل المثال ، فإنه يتناول العناصر التالية في السؤال الأصلي وغيرها من الإجابات:

  1. الكاردينال/الاسمي أو الترتيبية:"واحد" و "أول مرة"
  2. المشتركة الأخطاء الإملائية:"أربعين"/"أربعون" (لاحظ أنه لا صراحة في عنوان هذا سيكون شيء كنت تريد أن تفعل قبل أن تنتقل السلسلة إلى هذا المحلل.هذا المحلل يرى هذا المثال "أربعة"...)
  3. مئات/آلاف:2100 -> "عشرين ومائة" و أيضا "من ألفي ومائة"
  4. الفواصل:"أحد عشر مائة وخمسين اثنين" ، ولكن أيضا "elevenhundred fiftytwo" أو "أحد عشر مائة وخمسين اثنين" وغيرها
  5. colloqialisms:"والثلاثين شيئا" (وهذا أيضا ليس تماما إلى ما هو "شيء" ؟ حسنا, هذا الرمز يجد هذا الرقم ببساطة "30").**

الآن, بدلا من تخزين هذا الوحش العادية التعبير في المصدر الخاص بك, كنت تفكر في بناء هذا RegEx في وقت التشغيل باستخدام شيء كما يلي:

char *ones[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve",
  "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
char *tens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
char *ordinalones[] = { "", "first", "second", "third", "fourth", "fifth", "", "", "", "", "", "", "twelfth" };
char *ordinaltens[] = { "", "", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" };
and so on...

الجزء السهل هنا نحن فقط تخزين الكلمات في هذا الشأن.في حالة السادسة, ستلاحظ أن ليس هناك من الدخول لأنه هو العدد الطبيعي مع ال علق على...ولكن منها مثل اثني عشر تحتاج إلى عناية مختلفة.

حسنا, حتى الآن لدينا قانون لبناء (القبيح) RegEx, الآن نحن فقط تنفيذ ذلك على عدد السلاسل.

شيء واحد أود أن أوصي هو مرشح أو تناول الطعام كلمة "ثم".ليس فقط يؤدي إلى قضايا أخرى.

إذا ما كنت تريد القيام به هو إعداد وظيفة التي يمر اسمه مباريات "حجم" في وظيفة التي تبدو في كل حجم والقيم يضاعف النتيجة الحالية قبل أن قيمة المقدار.ثم يمكنك إنشاء دالة التي تبدو في "قيمة" اسمه المباريات ، ويعود الباحث (أو أيا كان كنت تستخدم) ، على أساس القيمة اكتشف هناك.

كل قيمة المباريات تضاف إلى النتيجة ، في حين magnitutde مباريات مضاعفة النتيجة عن طريق النيابة العسكرية القيمة.لذا مائتان وخمسون ألف يصبح "2" ، ثم "2 * 100" ، ثم "200 + 50", ثم "250 * 1000" ، وتنتهي مع 250000...

فقط من أجل المتعة ، كتبت vbScript نسخة من هذا وعملت كبيرة مع جميع الأمثلة المقدمة.الآن, لا يدعم اسمه المباريات, لذلك اضطررت للعمل قليلا من الصعب الحصول على نتيجة صحيحة لكنها حصلت عليه.خلاصة القول إذا كان "قيمة" مباراة ، إضافة جهاز المتوازي.إذا كان حجم المباراة مضاعفة تراكم بنسبة 100, 1000, 1000000, 1000000000, الخ...هذا وسوف توفر لك مع بعض نتائج مذهلة جدا و كل ما عليك القيام به لضبط أشياء مثل "نصف" يتم إضافتها إلى RegEx في رمز علامة لهم و التعامل معهم.

حسنا, آمل أن يكون هذا الموضوع يساعد شخص ما هناك.إذا كان أي شخص تريد, يمكن أن المنصب من قبل vbScript البرمجية الزائفة التي اعتدت على هذا الاختبار مع ذلك, انها ليست جميلة رمز و ليس رمز الإنتاج.

إذا كنت قد..ما هو النهائية لغة هذا وسوف تكون مكتوبة ؟ C++, أو شيء من هذا القبيل كتابتها اللغة ؟ جريج Hewgill المصدر سوف تذهب شوطا طويلا في المساعدة على فهم كيف أن كل هذا يأتي معا.

اسمحوا لي أن أعرف إذا كنت يمكن أن يكون من أي مساعدة أخرى.آسف, أنا فقط أعرف اللغة الإنجليزية/الأمريكية, لذلك أنا لا يمكن أن تساعد لكم مع اللغات الأخرى.

لقد تم تحويل ترتيبي الطبعة البيانات من أوائل الكتب الحديثة (مثل"2nd edition", "Editio quarta") على الأعداد الصحيحة و الدعم الترتيبية 1-100 في اللغة الإنجليزية و الترتيبية 1-10 في بعض اللغات الرومانسية.هنا ما جاء في بايثون:

def get_data_mapping():
  data_mapping = {
    "1st": 1,
    "2nd": 2,
    "3rd": 3,

    "tenth": 10,
    "eleventh": 11,
    "twelfth": 12,
    "thirteenth": 13,
    "fourteenth": 14,
    "fifteenth": 15,
    "sixteenth": 16,
    "seventeenth": 17,
    "eighteenth": 18,
    "nineteenth": 19,
    "twentieth": 20,

    "new": 2,
    "newly": 2,
    "nova": 2,
    "nouvelle": 2,
    "altera": 2,
    "andere": 2,

    # latin
    "primus": 1,
    "secunda": 2,
    "tertia": 3,
    "quarta": 4,
    "quinta": 5,
    "sexta": 6,
    "septima": 7,
    "octava": 8,
    "nona": 9,
    "decima": 10,

    # italian
    "primo": 1,
    "secondo": 2,
    "terzo": 3,
    "quarto": 4,
    "quinto": 5,
    "sesto": 6,
    "settimo": 7,
    "ottavo": 8,
    "nono": 9,
    "decimo": 10,

    # french
    "premier": 1,
    "deuxième": 2,
    "troisième": 3,
    "quatrième": 4,
    "cinquième": 5,
    "sixième": 6,
    "septième": 7,
    "huitième": 8,
    "neuvième": 9,
    "dixième": 10,

    # spanish
    "primero": 1,
    "segundo": 2,
    "tercero": 3,
    "cuarto": 4,
    "quinto": 5,
    "sexto": 6,
    "septimo": 7,
    "octavo": 8,
    "noveno": 9,
    "decimo": 10
  }

  # create 4th, 5th, ... 20th
  for i in xrange(16):
    data_mapping[str(4+i) + "th"] = 4+i

  # create 21st, 22nd, ... 99th
  for i in xrange(79):
    last_char = str(i)[-1]

    if last_char == "0":
      data_mapping[str(20+i) + "th"] = 20+i

    elif last_char == "1":
      data_mapping[str(20+i) + "st"] = 20+i

    elif last_char == "2":
      data_mapping[str(20+i) + "nd"] = 20+i

    elif last_char == "3":
      data_mapping[str(20+i) + "rd"] = 20+i

    else:
      data_mapping[str(20+i) + "th"] = 20+i

  ordinals = [
    "first", "second", "third", 
    "fourth", "fifth", "sixth", 
    "seventh", "eighth", "ninth"
  ]

  # create first, second ... ninth
  for c, i in enumerate(ordinals):
    data_mapping[i] = c+1

  # create twenty-first, twenty-second ... ninty-ninth
  for ci, i in enumerate([
    "twenty", "thirty", "forty", 
    "fifty", "sixty", "seventy", 
    "eighty", "ninety"
  ]):
    for cj, j in enumerate(ordinals):
      data_mapping[i + "-" + j] = 20 + (ci*10) + (cj+1)
    data_mapping[i.replace("y", "ieth")] = 20 + (ci*10)

  return data_mapping

محاولة

  1. فتح طلب HTTP إلى "http://www.google.com/search?q="+ عدد + "+في+عشري".

  2. تحليل النتيجة رقم هاتفك.

  3. ذاكرة التخزين المؤقت رقم / نتيجة أزواج الدرس الطلبات مع مرور الوقت.

مكان واحد للبدء في النظر هو غنو get_date ليب, التي يمكن تحليل مجرد عن أي الإنجليزية النصية تاريخ إلى الطابع الزمني.في حين ليس بالضبط ما كنت تبحث عن حل مشكلة مماثلة يمكن أن توفر الكثير من القرائن المفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top