Soru Sayı kelimeleri Integers'e dönüştürmenin bir yolu var mı?


Dönüştürmem gerek one içine 1, two içine 2 ve bunun gibi.

Bunu bir kütüphane veya bir dersle veya başka bir şeyle yapmanın bir yolu var mı?


44
2018-01-29 20:07


Menşei


Ayrıca bakınız: stackoverflow.com/questions/70161/... - tzot
Belki bu yararlı olur: pastebin.com/WwFCjYtt - alvas


Cevaplar:


Bu kodun büyük bir kısmı, yalnızca ilk görüşmede yapılan numwords dict'ı kurmaktır.

def text2int(textnum, numwords={}):
    if not numwords:
      units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
      ]

      tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

      scales = ["hundred", "thousand", "million", "billion", "trillion"]

      numwords["and"] = (1, 0)
      for idx, word in enumerate(units):    numwords[word] = (1, idx)
      for idx, word in enumerate(tens):     numwords[word] = (1, idx * 10)
      for idx, word in enumerate(scales):   numwords[word] = (10 ** (idx * 3 or 2), 0)

    current = result = 0
    for word in textnum.split():
        if word not in numwords:
          raise Exception("Illegal word: " + word)

        scale, increment = numwords[word]
        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return result + current

print text2int("seven billion one hundred million thirty one thousand three hundred thirty seven")
#7100031337

85
2018-01-29 22:32



neyse bir kullanıcı için sadece reincarnate kene? ;) - Bleeding Fingers
Bilginize, bu tarihlerle çalışmayacak. Deneyin: print text2int("nineteen ninety six") # 115 - Nick Ruiz
1996'da bir kelime olarak doğru yazmanın yolu "bin dokuz yüz doksan altı" dır. Yılları desteklemek istiyorsanız, farklı kodlara ihtiyacınız olacak. - recursive
Orada bir yakut Marc Burns bunu yapıyor. Geçenlerde yıllardır destek vermeyi istedim. Arayabilirsin python'dan ruby ​​kodu. - dimid
Bu 'yüz ve altı' için dener. print (text2int ("hundred and six")) .. ayrıca yazdır (text2int ("bin")) - Harish Kayarohanam


Kod pasajı için teşekkürler ... bana çok zaman kazandı!

Sıralı kelimeler ("ilk", "ikinci"), tireli sözcükler ("yüz") ve ("elli yedinci") gibi tireli sıralı kelimeler gibi birkaç ayrı ayrıştırma vakasının ele alınması gerekiyordu, bu yüzden ekledim birkaç satır:

def text2int(textnum, numwords={}):
    if not numwords:
        units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
        ]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion"]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units):  numwords[word] = (1, idx)
        for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]

    textnum = textnum.replace('-', ' ')

    current = result = 0
    for word in textnum.split():
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                raise Exception("Illegal word: " + word)

            scale, increment = numwords[word]

         current = current * scale + increment
         if scale > 100:
            result += current
            current = 0

    return result + current`

7
2018-02-28 17:10



Not: Bu, sıfır için döndürür hundredth, thousandth vb kullanın one hundredth almak 100! - rohithpr


Herhangi biri ilgilenirse, dizenin geri kalanını koruyan bir sürümü hackledim (hatalar olsa da, çok fazla test etmemiş olsa da).

def text2int (textnum, numwords={}):
    if not numwords:
        units = [
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
        ]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion"]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units):  numwords[word] = (1, idx)
        for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]

    textnum = textnum.replace('-', ' ')

    current = result = 0
    curstring = ""
    onnumber = False
    for word in textnum.split():
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
            current = current * scale + increment
            if scale > 100:
                result += current
                current = 0
            onnumber = True
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                if onnumber:
                    curstring += repr(result + current) + " "
                curstring += word + " "
                result = current = 0
                onnumber = False
            else:
                scale, increment = numwords[word]

                current = current * scale + increment
                if scale > 100:
                    result += current
                    current = 0
                onnumber = True

    if onnumber:
        curstring += repr(result + current)

    return curstring

Örnek:

 >>> text2int("I want fifty five hot dogs for two hundred dollars.")
 I want 55 hot dogs for 200 dollars.

"200 $" dırsanız sorun olabilir. Ama bu gerçekten zordu.


7
2017-08-04 07:04





İşte önemsiz dava yaklaşımı:

>>> number = {'one':1,
...           'two':2,
...           'three':3,}
>>> 
>>> number['two']
2

Yoksa idare edebilecek bir şey mi arıyorsunuz? "oniki bin, yüz yetmiş iki"?


4
2018-01-29 20:25





Ayrıştırmak istediğiniz sınırlı sayıda numara varsa, bu bir sözlükte kolayca kodlanabilir.

Biraz daha karmaşık durumlar için, muhtemelen nispeten basit sayılara dayalı olarak bu sözlüğü otomatik olarak oluşturmak isteyeceksiniz. Bu hat boyunca bir şey (elbette, genelleştirilmiş ...)

for i in range(10):
   myDict[30 + i] = "thirty-" + singleDigitsDict[i]

Daha kapsamlı bir şeye ihtiyacınız varsa, doğal dil işleme araçlarına ihtiyacınız olacaktır. Bu makale iyi bir başlangıç ​​noktası olabilir.


3
2018-01-29 20:28





Bu, 1. cevabın kodunun c # uygulamasıdır:

public static double ConvertTextToNumber(string text)
{
    string[] units = new string[] {
        "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
        "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen",
    };

    string[] tens = new string[] {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    string[] scales = new string[] { "hundred", "thousand", "million", "billion", "trillion" };

    Dictionary<string, ScaleIncrementPair> numWord = new Dictionary<string, ScaleIncrementPair>();
    numWord.Add("and", new ScaleIncrementPair(1, 0));
    for (int i = 0; i < units.Length; i++)
    {
        numWord.Add(units[i], new ScaleIncrementPair(1, i));
    }

    for (int i = 1; i < tens.Length; i++)
    {
        numWord.Add(tens[i], new ScaleIncrementPair(1, i * 10));                
    }

    for (int i = 0; i < scales.Length; i++)
    {
        if(i == 0)
            numWord.Add(scales[i], new ScaleIncrementPair(100, 0));
        else
            numWord.Add(scales[i], new ScaleIncrementPair(Math.Pow(10, (i*3)), 0));
    }

    double current = 0;
    double result = 0;

    foreach (var word in text.Split(new char[] { ' ', '-', '—'}))
    {
        ScaleIncrementPair scaleIncrement = numWord[word];
        current = current * scaleIncrement.scale + scaleIncrement.increment;
        if (scaleIncrement.scale > 100)
        {
            result += current;
            current = 0;
        }
    }
    return result + current;
}


public struct ScaleIncrementPair
{
    public double scale;
    public int increment;
    public ScaleIncrementPair(double s, int i)
    {
        scale = s;
        increment = i;
    }
}

3
2018-04-23 14:21



Bu benim sevdiğim şey - aynı cevabı uygulamak için farklı yollarla genişleyen cevaplara uzantıları görüyorum. Soru zaten cevaplandırıldığı için, soruşturmacının belirtmediği bir dilde uygulamak zarar vermez. Ama o yaparkodları denemek ve uygulamak için gelen insanlara yardım edin. Bu sorunun gelecekteki okuyucularına yardımcı olmak için, +1


PyPI'ye bir python modülü yayınladım. word2number kesin amaç için. https://github.com/akshaynagpal/w2n

Kullanarak yükleyin:

pip install word2number

Piponuzun en son sürüme güncellendiğinden emin olun.

Kullanımı:

from word2number import w2n

print w2n.word_to_num("two million three thousand nine hundred and eighty four")
2003984

3
2018-01-02 18:48



Paketini denedim. Dizeleri işlemeyi öneririm: "1 million" veya "1M". w2n.word_to_num ("1 milyon") bir hata veriyor. - Ray
@Ray Denediğiniz için teşekkürler. Lütfen bir sorun çıkarabilir misiniz github.com/akshaynagpal/w2n/issues . İsterseniz katkıda bulunabilirsiniz. Else, bir sonraki sürümde bu konuya kesinlikle bakacağım. Tekrar teşekkürler! - akshaynagpal
Bu paketi kullanmayla ilgili tavsiyede bulunun: github.com/akshaynagpal/w2n/issues/7 - Robert Elwell
Robert, Açık kaynak yazılımı, insanların işbirliğine dayalı olarak geliştirmeleri ile ilgilidir. Bir kütüphane istedim ve insanların da istediğini gördü. Bu yüzden yaptı. Üretim seviyesi sistemleri için hazır olmayabilir veya ders kitabı buzzwords'e uygun olmayabilir. Ama amaç için çalışıyor. Ayrıca, tüm kullanıcılar için daha da geliştirilebilmesi için bir PR sunabilmeniz harika olurdu. - akshaynagpal


Değişiklik yapıldığında, text2int (ölçek) doğru dönüşümü döndürür. Örneğin, text2int ("yüz") => 100.

import re

numwords = {}


def text2int(textnum):

    if not numwords:

        units = [ "zero", "one", "two", "three", "four", "five", "six",
                "seven", "eight", "nine", "ten", "eleven", "twelve",
                "thirteen", "fourteen", "fifteen", "sixteen", "seventeen",
                "eighteen", "nineteen"]

        tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", 
                "seventy", "eighty", "ninety"]

        scales = ["hundred", "thousand", "million", "billion", "trillion", 
                'quadrillion', 'quintillion', 'sexillion', 'septillion', 
                'octillion', 'nonillion', 'decillion' ]

        numwords["and"] = (1, 0)
        for idx, word in enumerate(units): numwords[word] = (1, idx)
        for idx, word in enumerate(tens): numwords[word] = (1, idx * 10)
        for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)

    ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 
            'eighth':8, 'ninth':9, 'twelfth':12}
    ordinal_endings = [('ieth', 'y'), ('th', '')]
    current = result = 0
    tokens = re.split(r"[\s-]+", textnum)
    for word in tokens:
        if word in ordinal_words:
            scale, increment = (1, ordinal_words[word])
        else:
            for ending, replacement in ordinal_endings:
                if word.endswith(ending):
                    word = "%s%s" % (word[:-len(ending)], replacement)

            if word not in numwords:
                raise Exception("Illegal word: " + word)

            scale, increment = numwords[word]

        if scale > 1:
            current = max(1, current)

        current = current * scale + increment
        if scale > 100:
            result += current
            current = 0

    return result + current

1
2018-04-21 18:37



100 ingilizce ingilizce yazımının "yüz" olduğunu düşünüyorum. - recursive
@recursive kesinlikle haklısınız, ancak bu kodun avantajı "yüzüncü" (belki de Dawa vurgulamak için çalışıyordu) işliyor olmasıdır. Açıklamanın sesinden, diğer benzer kod "yüzüncü" ye ihtiyaç duyuyordu ve bu her zaman yaygın olarak kullanılan terim değil (örneğin "atmak için yüzüncü maddeyi seçmiş" gibi) - Neil