SORU
16 EYLÜL 2008, Salı


Nasıl numaraları yazılı değerleri okumak için?

Hepimizin bildiği gibi numaralar, rakamsal, veya kendi ismi yazılmış olabilir. Yüz yirmi üç 123 dönüştürmek bulunan pek çok örneği olmakla birlikte, bunun tersi dönüştürmek için nasıl iyi bir örnek bulamadım.

Uyarılar:

  1. kardinal/nominal veya sıralı: "bir" ve "" . ilk
  2. genel yazım hataları: """" . kırk/kırk
  3. binlerce/yüzlerce: 2100 ->"yirmi bir yüz" ve "bin iki yüz"
  4. ayırıcılar: "bin yüz elli iki", aynı zamanda "" veya "on-yüz elli-iki" falan filan . fiftytwo elevenhundred
  5. colloqialisms: "otuz-bir şey"
  6. parça sayısı: 'üçte bir', 'iki beşte'
  7. ortak isim: 'bir düzine', 'yarım'

Ve muhtemelen henüz listede yer almayan daha olası uyarılar var. Algoritma çok sağlam olması gerekiyor sanırım, hatta imla hataları anlamak.

Kağıtları//algoritmalar okusam tüm bu yazma öğrenmek incelemeleri/ne tarlası? Bilgiler nerede?

PS: Benim son çözümleyici aslında 3 farklı dilde anlamalı, İngilizce, Rusça ve İbranice. Ve belki de daha sonraki bir aşamada daha fazla dil eklenecektir. İbranice de erkek/kadın numaraları vardır, "tek adam" ve "bir kadın" farklı "bir", "" ve "". ahat ehad gibi Rusya da kendine özgü bazı karmaşıklığı vardır.

Google, örneğin: bu harika bir iş yok

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

(tersi de mümkün http://www.google.com/search?q=999999999999 in english)

CEVAP
17 Mart 2009, Salı


Ben oynamak ile bir PEG çözümleyici ne istediğini (ve Mayıs sonrası olarak ayrı bir cevap sonra) fark ettim ki çok basit bir algoritma, bir oldukça iyi bir iş ile ortak formları sayıda İngilizce, İspanyolca, Almanca, en azından.

Örneğin İngilizce ile çalışıyor, bariz bir şekilde değerler için kelimeler eşleyen bir sözlük gerekir:

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

...ve benzeri

Algoritma sadece:

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

Örneğin, bu aşağıdaki gibi ilerler

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

Ve benzeri. Mükemmel demiyorum, ama hızlı ve kirli için oldukça iyi.

< / ^ hr .

Düzen belirli listenize hitaben:

  1. "" ve "ilk" -- . bir kardinal/nominal veya sıralı: ^strong>sadece sözlükte koydu
  2. İngilizce/İngiliz: """ -- . kırk"/kırk ^strong>aynen
  3. yüzlerce/binlerce: 2100 ->"yirmi bir yüz" ve "bin iki yüz" --çalışır gibi
  4. ayırıcılar: "bin yüz elli iki", aynı zamanda "" veya "on-yüz elli-iki" falan filan -- . fiftytwo elevenhundred ^strong>sadece "" tanımlanmış bir kelime veya bir sonraki eğer yok, başlangıç için iyi olmayan kelime . eşleşen en uzun önek olarak bir sonraki kelime tanımlamak
  5. "otuz-bir şey" -- . colloqialisms: ^strong>çalışır
  6. parça sayısı: 'üçte biri, 'beşte ikisi' -- .' ^strong>henüz değil...
  7. ortak isim: 'bir düzine' yarım'--.' ^strong>; bile şeyler yapabilirsiniz eserleri "yarım düzine"

6 numara olduğunu bir tek ben yok hazır cevap, çünkü belirsizlik arasında sıra sayıları ve kesirleri (İngilizce en az) eklendi aslında bu benim son kahvebirçoksaat önce.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • MkElite

    MkElite

    13 NİSAN 2012