এক কথায় সিলেবলস সনাক্ত করা


138

একটি শব্দে সিলেবলগুলি সনাক্ত করার জন্য আমার মোটামুটি দক্ষ উপায় খুঁজে বের করা উচিত। যেমন,

অদৃশ্য -> ইন-ভি-সিব-লে

কিছু পাঠ্যক্রমের নিয়ম রয়েছে যা ব্যবহার করা যেতে পারে:

ভি সিভি ভিসি সিভিসি সিসিভি সিসিসিভি সিভিসিসি

* যেখানে ভি একটি স্বর এবং সি ব্যঞ্জনবর্ণ। যেমন,

উচ্চারণ (5 প্রো-নুন-সিআই-এ-টিয়ন; সিভি-সিভিসি-সিভি-ভি-সিভিসি)

আমি কয়েকটি পদ্ধতি ব্যবহার করেছি, যার মধ্যে রেজেজ (যা কেবলমাত্র সিলেবলগুলি গণনা করতে চাইলে সহায়তা করে) বা হার্ড কোডেড বিধি সংজ্ঞা (একটি ব্রুট ফোর্স অ্যাপ্রোচ যা খুব অদক্ষ প্রমাণিত হয়) ব্যবহার করে এবং শেষ পর্যন্ত একটি সীমাবদ্ধ রাষ্ট্র অটোম্যাটা ব্যবহার করেছিল (যা করেছিল দরকারী কিছু সঙ্গে ফলাফল না)।

আমার আবেদনের উদ্দেশ্য হল একটি নির্দিষ্ট ভাষায় সমস্ত সিলেবলের একটি অভিধান তৈরি করা। এই অভিধানটি পরে স্পেল চেকিং অ্যাপ্লিকেশনগুলির জন্য (বায়েশিয়ান শ্রেণিবদ্ধ ব্যবহার করে) এবং বাক্য সংশ্লেষণে পাঠ্য হিসাবে ব্যবহৃত হবে।

আমার প্রশংসা করব যদি কেউ আমার পূর্ববর্তী পদ্ধতির পাশাপাশি এই সমস্যা সমাধানের বিকল্প উপায় সম্পর্কে টিপস দিতে পারে।

আমি জাভাতে কাজ করি, তবে সি / সি ++, সি #, পাইথন, পার্ল ... এর যে কোনও টিপ আমার পক্ষে কাজ করবে।


আপনি কি প্রকৃত বিভাগের পয়েন্টগুলি বা একটি শব্দে কেবলমাত্র উচ্চারণের সংখ্যা চান? যদি দ্বিতীয়টি হয় তবে একটি পাঠ্য থেকে স্পিচ অভিধানে শব্দগুলি সন্ধান করার জন্য বিবেচনা করুন এবং স্বরধ্বনিগুলি এনকোড করে এমন ফোনমাগুলি গণনা করুন।
অ্যাড্রিয়ান ম্যাকার্থি

সর্বাধিক কার্যকর উপায় (গণনা-ভিত্তিক; স্টোরেজ-ওয়াইজ নয়), আমি অনুমান করব যে কী হিসাবে একটি শব্দকথার একটি পাইথন অভিধান এবং মান হিসাবে সিলেবলের সংখ্যা থাকবে। তবে, আপনার এখনও শব্দগুলির জন্য ফ্যালব্যাকের প্রয়োজন হবে যা অভিধানে এটি তৈরি করে নি। আপনি যদি কখনও এরকম একটি অভিধান পান তবে আমাকে জানান!
ব্রুটসর্ফুজথ্রিক্স

উত্তর:


120

হাইফেনেশনের উদ্দেশ্যে এই সমস্যার জন্য টেক্স পদ্ধতির বিষয়ে পড়ুন। বিশেষত ফ্রাঙ্ক লিয়াংয়ের থিসিস গবেষণামূলক প্রবন্ধটি কম-পুট-এর দ্বারা লেখা হাই-ফেন-এ-টিওন দেখুন । তার অ্যালগরিদম খুব নির্ভুল এবং এরপরে অ্যালগোরিদম কাজ না করে এমন ক্ষেত্রে একটি ছোট ব্যতিক্রম অভিধান অন্তর্ভুক্ত করে।


52
আমি পছন্দ করি যে আপনি এই বিষয়ে একটি থিসিস গবেষণামূলক উদ্ধৃতি দিয়েছেন, এটি মূল পোস্টারটির প্রতি সামান্য ইঙ্গিত যা এটি কোনও সহজ প্রশ্ন নাও হতে পারে।
কার্ল 17

হ্যাঁ, আমি সচেতন যে এটি কোনও সাধারণ প্রশ্ন নয়, যদিও আমি এতে খুব বেশি কাজ করি নি। যদিও আমি সমস্যাটিকে অবমূল্যায়ন করেছি, আমি ভেবেছিলাম আমার অ্যাপের অন্যান্য অংশে কাজ করব এবং পরে এই 'সাধারণ' সমস্যাটিতে ফিরে আসব। বোকা আমাকে :)
ব্যবহারকারীর 50705

আমি বিচ্যুতির কাগজ পড়েছি এবং এটি খুব সহায়ক বলে মনে করেছি। পদ্ধতির সাথে সমস্যাটি হ'ল আমার কাছে আলবেনীয় ভাষার জন্য কোনও নিদর্শন ছিল না, যদিও আমি এমন কিছু সরঞ্জাম পেয়েছি যা এই নিদর্শনগুলি তৈরি করতে পারে। যাইহোক, আমার প্রয়োজনে আমি একটি নিয়ম ভিত্তিক অ্যাপ লিখেছিলাম, যা সমস্যার সমাধান করেছে ...
ব্যবহারকারী 50705

10
দ্রষ্টব্য যে টেক্স অ্যালগরিদম বৈধ হাইফেনেশন পয়েন্টগুলি সন্ধানের জন্য, যা সিলেবল বিভাগগুলির মতো ঠিক নয়। এটি সত্য যে হাইফেনেশন পয়েন্টগুলি বর্ণনামূলক বিভাগগুলিতে পড়ে তবে সমস্ত অক্ষরের বিভাগগুলি বৈধ হাইফেনেশন পয়েন্ট নয়। উদাহরণস্বরূপ, হাইফেনগুলি (সাধারণত) কোনও শব্দের উভয় প্রান্তের দুটি বা দুটি বর্ণের মধ্যে ব্যবহৃত হয় না। আমি আরও বিশ্বাস করি যে টেক্সের ধরণগুলি মিথ্যা ধনাত্মকতার জন্য মিথ্যা নেতিবাচক ব্যবসা করার জন্য সুর করা হয়েছিল (এটি কোনও হাইফেন রাখবেন না যেখানে এটি অন্তর্ভুক্ত নয়, এমনকি যদি এর কিছু বৈধ হাইফেনেশনের সুযোগ অনুপস্থিত থাকে তবে)।
অ্যাড্রিয়ান ম্যাকার্থি

1
হাইফেনেশন হয় উত্তর হয় আমি বিশ্বাস করি না।
এজেকুইল

46

আমি একই পৃষ্ঠাটির সন্ধানে এই পৃষ্ঠায় হোঁচট খেয়েছি এবং আমি এখানে লিয়াং কাগজের কয়েকটি বাস্তবায়ন পেয়েছি: https://github.com/mnater/hyphenator বা উত্তরসূরি: https://github.com/mnater/Hyphenopoly

যদি না আপনি সেই ধরণের হন যা অ-অনন্য সমস্যার জন্য মুক্তভাবে উপলব্ধ কোডটি মানিয়ে নেওয়ার পরিবর্তে 60 পৃষ্ঠার থিসিসটি পড়তে উপভোগ করেন। :)


একমত - অনেক বেশি সুবিধাজনক শুধু একটি বিদ্যমান implmentation ব্যবহার করতে
hoju

41

এনএলটিকে ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে :

from nltk.corpus import cmudict
d = cmudict.dict()
def nsyl(word):
  return [len(list(y for y in x if y[-1].isdigit())) for x in d[word.lower()]] 

আরে ধন্যবাদ ছোট বাচ্চার ত্রুটিটি ডিফ এনএসাইল (শব্দ) হওয়া উচিত: ফিরুন [লেন (তালিকাতে y এর জন্য x যদি y [-1] .আইডিজিট ()) এক্স এর জন্য x [শব্দ.ক্লুয়ার ()] ]
গর্নিউ

6
যে শব্দের মধ্যে নেই এমন শব্দের ফ্যালব্যাক হিসাবে আপনি কী প্রস্তাব করবেন?
ড্যান গেইল

4
উত্তর আমেরিকার ইংরেজি শব্দের জন্য @ শুফফেরেট সেমিউডিক্ট একটি উচ্চারণকারী অভিধান। এটি শব্দকে ফোনে বিভক্ত করে, যা শব্দাবলীর চেয়ে ছোট (যেমন 'বিড়াল' শব্দটি তিনটি ফোনে বিভক্ত: কে - এই - টি)। তবে স্বরগুলির "স্ট্রেস মার্কার" রয়েছে: শব্দের উচ্চারণের উপর ভিত্তি করে 0, 1, বা 2 হয় (সুতরাং 'বিড়ালের' AE1 হয়ে যায় AE1)। উত্তরের কোডটি মানসিক চাপ চিহ্নিতকারী এবং সেই সাথে স্বরগুলির সংখ্যা গণনা করে - যা কার্যকরভাবে সংখ্যার উচ্চারণের সংখ্যা দেয় (লক্ষ্য করুন কীভাবে ওপি-র উদাহরণগুলিতে প্রতিটি অক্ষরের ঠিক একটি স্বর রয়েছে)।
বিলি_চ্যাটার্স

1
এটি সিলেবলের সংখ্যা প্রদান করে, উচ্চারণ নয়।
অ্যাডাম মাইকেল উড

19

আমি এই প্রোগ্রামটির জন্য এই সমস্যাটি মোকাবিলার চেষ্টা করছি যা পাঠের একটি ব্লকের মাংসপেশী-কেনেদয়েড এবং দম্পতি পাঠের স্কোর গণনা করবে। আমার অ্যালগরিদম এই ওয়েবসাইটে আমি যা পেয়েছি তা ব্যবহার করে: http://www.howmanysyllables.com/howtocountsyllables.html এবং এটি যুক্তিসঙ্গতভাবে কাছে পেয়ে যায়। এটি এখনও অদৃশ্য এবং হাইফেনেশনের মতো জটিল শব্দের ক্ষেত্রে সমস্যা রয়েছে তবে আমি পেয়েছি এটি আমার উদ্দেশ্যে ব্যালপার্কে আসে।

এটি কার্যকর করা সহজ হওয়ার উল্টো দিক রয়েছে। আমি খুঁজে পেলাম "এস" হয় সিলেবিক হতে পারে বা নাও হতে পারে। এটি একটি জুয়া, তবে আমি আমার অ্যালগরিদমের এসগুলি সরিয়ে নেওয়ার সিদ্ধান্ত নিয়েছি।

private int CountSyllables(string word)
    {
        char[] vowels = { 'a', 'e', 'i', 'o', 'u', 'y' };
        string currentWord = word;
        int numVowels = 0;
        bool lastWasVowel = false;
        foreach (char wc in currentWord)
        {
            bool foundVowel = false;
            foreach (char v in vowels)
            {
                //don't count diphthongs
                if (v == wc && lastWasVowel)
                {
                    foundVowel = true;
                    lastWasVowel = true;
                    break;
                }
                else if (v == wc && !lastWasVowel)
                {
                    numVowels++;
                    foundVowel = true;
                    lastWasVowel = true;
                    break;
                }
            }

            //if full cycle and no vowel found, set lastWasVowel to false;
            if (!foundVowel)
                lastWasVowel = false;
        }
        //remove es, it's _usually? silent
        if (currentWord.Length > 2 && 
            currentWord.Substring(currentWord.Length - 2) == "es")
            numVowels--;
        // remove silent e
        else if (currentWord.Length > 1 &&
            currentWord.Substring(currentWord.Length - 1) == "e")
            numVowels--;

        return numVowels;
    }

আমার যথাযথ নামে সিলেবলগুলি সন্ধান করার সহজ দৃশ্যের জন্য এটি প্রাথমিকভাবে যথেষ্ট ভাল কাজ করছে বলে মনে হয়। এটি এখানে রাখার জন্য ধন্যবাদ।
নর্মান এইচ

7

এটি একটি বিশেষত সমস্যা যা ল্যাটেক্স হাইফেনেশন অ্যালগরিদম দ্বারা সম্পূর্ণরূপে সমাধান হয় না। কিছু উপলভ্য পদ্ধতি এবং এর সাথে জড়িত চ্যালেঞ্জগুলির একটি ভাল সংক্ষিপ্তসারটি ইংরেজির জন্য মূল্যায়ন অটোমেটিক সিলেবিফিকেশন অ্যালগরিদমগুলিতে পাওয়া যেতে পারে ( মার্চাঁদ, অ্যাডসেট এবং দাম্পার 2007)।


5

কেন এটি হিসাব? প্রতিটি অনলাইন অভিধানে এই তথ্য থাকে। d ভিসি · আই · ব্লিতে http: // d অভিধান.references.com/browse/invisible


3
হয়তো এটি এমন শব্দগুলির জন্য কাজ করতে হবে যা অভিধান হিসাবে প্রদর্শিত হয় না, যেমন নাম?
ওয়াউটার লাইভেন্সস

4
@ ওয়াটারলিভেনস: আমি মনে করি না যে নামগুলি স্বয়ংক্রিয়ভাবে সিলেবল পার্সিংয়ের জন্য যথেষ্ট পরিমাণে ভাল ব্যবহার করা হয়েছে near ওয়েলশ বা স্কটিশ বংশোদ্ভূত নামগুলির জন্য ইংরেজি নামের জন্য একটি উচ্চারণযোগ্য পার্সার খারাপভাবে ব্যর্থ হবে, ভারতীয় এবং নাইজেরিয়ান উত্সের নাম একা রাখুন, তবুও আপনি লন্ডনের কোথাও কোথাও কোনও একক ঘরে এই সমস্ত কিছু পেতে পারেন।
জিন-ফ্রান্সোইস কর্পেট

একজনকে অবশ্যই মনে রাখতে হবে যে এটি কোনও স্কেচী ডোমেনের জন্য নিখুঁতভাবে বৈজ্ঞানিক পদ্ধতি হিসাবে বিবেচনা করে কোনও মানুষ সরবরাহ করতে পারে তার চেয়ে ভাল পারফরম্যান্সের আশা করা যুক্তিসঙ্গত নয়।
ড্যারেন রিঞ্জার

5

জো ব্যাসিরিকো, সি # তে আপনার দ্রুত এবং নোংরা বাস্তবায়ন ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি বড় লাইব্রেরি ব্যবহার করেছি এবং সেগুলি কাজ করে তবে তারা সাধারণত কিছুটা ধীর হয় এবং দ্রুত প্রকল্পগুলির জন্য আপনার পদ্ধতিটি ঠিকঠাক কাজ করে।

পরীক্ষার মামলার পাশাপাশি জাভাতে আপনার কোডটি এখানে রয়েছে:

public static int countSyllables(String word)
{
    char[] vowels = { 'a', 'e', 'i', 'o', 'u', 'y' };
    char[] currentWord = word.toCharArray();
    int numVowels = 0;
    boolean lastWasVowel = false;
    for (char wc : currentWord) {
        boolean foundVowel = false;
        for (char v : vowels)
        {
            //don't count diphthongs
            if ((v == wc) && lastWasVowel)
            {
                foundVowel = true;
                lastWasVowel = true;
                break;
            }
            else if (v == wc && !lastWasVowel)
            {
                numVowels++;
                foundVowel = true;
                lastWasVowel = true;
                break;
            }
        }
        // If full cycle and no vowel found, set lastWasVowel to false;
        if (!foundVowel)
            lastWasVowel = false;
    }
    // Remove es, it's _usually? silent
    if (word.length() > 2 && 
            word.substring(word.length() - 2) == "es")
        numVowels--;
    // remove silent e
    else if (word.length() > 1 &&
            word.substring(word.length() - 1) == "e")
        numVowels--;
    return numVowels;
}

public static void main(String[] args) {
    String txt = "what";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
    txt = "super";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
    txt = "Maryland";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
    txt = "American";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
    txt = "disenfranchized";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
    txt = "Sophia";
    System.out.println("txt="+txt+" countSyllables="+countSyllables(txt));
}

ফলাফলটি প্রত্যাশার মতো ছিল (এটি ফ্ল্লেস-কেনকেডের পক্ষে যথেষ্ট ভাল কাজ করে):

txt=what countSyllables=1
txt=super countSyllables=2
txt=Maryland countSyllables=3
txt=American countSyllables=3
txt=disenfranchized countSyllables=5
txt=Sophia countSyllables=2

5

@ টিহামার এবং @ জো-বাসিরিকো বাম্পিং করা হচ্ছে। খুব দরকারী ফাংশন, নিখুঁত নয় , তবে বেশিরভাগ ছোট থেকে মাঝারি প্রকল্পের জন্য ভাল। জো, আমি পাইথনে আপনার কোডটির একটি বাস্তবায়ন পুনরায় লিখেছি:

def countSyllables(word):
    vowels = "aeiouy"
    numVowels = 0
    lastWasVowel = False
    for wc in word:
        foundVowel = False
        for v in vowels:
            if v == wc:
                if not lastWasVowel: numVowels+=1   #don't count diphthongs
                foundVowel = lastWasVowel = True
                        break
        if not foundVowel:  #If full cycle and no vowel found, set lastWasVowel to false
            lastWasVowel = False
    if len(word) > 2 and word[-2:] == "es": #Remove es - it's "usually" silent (?)
        numVowels-=1
    elif len(word) > 1 and word[-1:] == "e":    #remove silent e
        numVowels-=1
    return numVowels

আশা করি কেউ এই কাজে লাগবে!


4

পার্লের লিঙ্গুয়া :: ফোনোলজি :: সিলেবল মডিউল রয়েছে। আপনি এটি চেষ্টা করতে পারেন, বা এর অ্যালগরিদম সন্ধান করার চেষ্টা করতে পারেন। আমি সেখানে আরও কয়েকটি পুরানো মডিউল দেখেছি।

আমি বুঝতে পারি না কেন নিয়মিত প্রকাশ আপনাকে কেবলমাত্র উচ্চারণের একটি সংখ্যা দেয়। আপনি ক্যাপচার প্রথম বন্ধনী ব্যবহার করে সিলেবলগুলি নিজেই পেতে সক্ষম হবেন। ধরে নিচ্ছি আপনি একটি নিয়মিত ভাব প্রকাশ করতে পারেন যা কাজ করে that


4

আজ আমি এই জাভা বাস্তবায়নটি ইংরাজী বা জার্মানের প্যাটার্ন সহ ফ্র্যাঙ্ক লিয়াংয়ের হাইফেনেশন অ্যালগরিদমনের খুঁজে পেয়েছি , যা বেশ ভালভাবে কাজ করে এবং ম্যাভেন সেন্ট্রালে উপলব্ধ।

গুহা: .texপ্যাটার্ন ফাইলগুলির শেষ লাইনগুলি সরিয়ে ফেলা গুরুত্বপূর্ণ , কারণ অন্যথায় files ফাইলগুলি মাভেন সেন্ট্রালে বর্তমান সংস্করণে লোড করা যায় না।

লোড এবং ব্যবহার করতে hyphenator, আপনি নিম্নলিখিত জাভা কোড স্নিপেট ব্যবহার করতে পারেন। প্রয়োজনীয় নিদর্শনগুলি যুক্ত ফাইলগুলির texTableনাম .tex। এই ফাইলগুলি প্রকল্পের গিথুব সাইটে উপলব্ধ।

 private Hyphenator createHyphenator(String texTable) {
        Hyphenator hyphenator = new Hyphenator();
        hyphenator.setErrorHandler(new ErrorHandler() {
            public void debug(String guard, String s) {
                logger.debug("{},{}", guard, s);
            }

            public void info(String s) {
                logger.info(s);
            }

            public void warning(String s) {
                logger.warn("WARNING: " + s);
            }

            public void error(String s) {
                logger.error("ERROR: " + s);
            }

            public void exception(String s, Exception e) {
                logger.error("EXCEPTION: " + s, e);
            }

            public boolean isDebugged(String guard) {
                return false;
            }
        });

        BufferedReader table = null;

        try {
            table = new BufferedReader(new InputStreamReader(Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream((texTable)), Charset.forName("UTF-8")));
            hyphenator.loadTable(table);
        } catch (Utf8TexParser.TexParserException e) {
            logger.error("error loading hyphenation table: {}", e.getLocalizedMessage(), e);
            throw new RuntimeException("Failed to load hyphenation table", e);
        } finally {
            if (table != null) {
                try {
                    table.close();
                } catch (IOException e) {
                    logger.error("Closing hyphenation table failed", e);
                }
            }
        }

        return hyphenator;
    }

এরপরে Hyphenatorব্যবহারের জন্য প্রস্তুত। সিলেবলগুলি সনাক্ত করতে, প্রাথমিক ধারণাটি প্রদত্ত হাইফেনগুলিতে শব্দটি বিভক্ত করা।

    String hyphenedTerm = hyphenator.hyphenate(term);

    String hyphens[] = hyphenedTerm.split("\u00AD");

    int syllables = hyphens.length;

আপনার "\u00AD"এ বিভক্ত হওয়া দরকার , যেহেতু এপিআই কোনও স্বাভাবিক ফিরে আসে না "-"

এই পদ্ধতির জো বাসিরিকোর উত্তরকে ছাপিয়ে গেছে, যেহেতু এটি অনেকগুলি ভিন্ন ভাষাকে সমর্থন করে এবং জার্মান হাইফেনেশনটিকে আরও সঠিকভাবে সনাক্ত করে।


4

আমি কিছুক্ষন আগে এই একই একই ইস্যুতে দৌড়েছি।

আমি বেশিরভাগ শব্দের তাত্ক্ষণিক ও নির্ভুল অনুসন্ধানের জন্য সিএমইউ উচ্চারণ অভিধান ব্যবহার করে শেষ করেছি । অভিধানে নেই এমন শব্দের জন্য, আমি একটি মেশিন লার্নিং মডেলটিতে ফিরে এসেছি যা l 98% সিলেবল গুনের পূর্বাভাস দেওয়ার ক্ষেত্রে সঠিক।

আমি পুরো জিনিসটি এখানে সহজে ব্যবহারযোগ্য পাইথন মডিউলটিতে গুটিয়ে রেখেছি: https://github.com/repp/big-phoney

ইনস্টল করুন: pip install big-phoney

সিলেবল গণনা করুন:

from big_phoney import BigPhoney
phoney = BigPhoney()
phoney.count_syllables('triceratops')  # --> 4

যদি আপনি পাইথন ব্যবহার না করে থাকেন এবং আপনি এমএল-মডেল-ভিত্তিক পদ্ধতির চেষ্টা করতে চান , তবে ক্যাগলে সিলেবল কাউন্টিং মডেল কীভাবে কাজ করে সে সম্পর্কে আমি একটি সুন্দর বিস্তারিত লিখেছিলাম


এটি দুর্দান্ত। আইওএস ব্যবহারের জন্য কারও কি ভাগ্য পেয়েছে যে ফলস্বরূপ কেরাস মডেলটিকে একটি করিমেল মডেল রূপান্তর করবে?
অ্যালেক্সান্ডার আকার্স

2

আপনাকে @ জো-বাসিরিকো এবং @ থাইমারকে ধন্যবাদ। আমি @ টিহামারের কোড লুয়া 5.1, 5.2 এবং লুজিট 2 তে পোর্ট করেছি ( সম্ভবত সম্ভবত লুয়ার অন্যান্য সংস্করণেও চলবে ):

countsyllables.lua

function CountSyllables(word)
  local vowels = { 'a','e','i','o','u','y' }
  local numVowels = 0
  local lastWasVowel = false

  for i = 1, #word do
    local wc = string.sub(word,i,i)
    local foundVowel = false;
    for _,v in pairs(vowels) do
      if (v == string.lower(wc) and lastWasVowel) then
        foundVowel = true
        lastWasVowel = true
      elseif (v == string.lower(wc) and not lastWasVowel) then
        numVowels = numVowels + 1
        foundVowel = true
        lastWasVowel = true
      end
    end

    if not foundVowel then
      lastWasVowel = false
    end
  end

  if string.len(word) > 2 and
    string.sub(word,string.len(word) - 1) == "es" then
    numVowels = numVowels - 1
  elseif string.len(word) > 1 and
    string.sub(word,string.len(word)) == "e" then
    numVowels = numVowels - 1
  end

  return numVowels
end

এবং এটি কার্যকর করার জন্য কয়েকটি মজাদার পরীক্ষা ( এটি যতটা অনুমান করা উচিত ):

countsyllables.tests.lua

require "countsyllables"

tests = {
  { word = "what", syll = 1 },
  { word = "super", syll = 2 },
  { word = "Maryland", syll = 3},
  { word = "American", syll = 4},
  { word = "disenfranchized", syll = 5},
  { word = "Sophia", syll = 2},
  { word = "End", syll = 1},
  { word = "I", syll = 1},
  { word = "release", syll = 2},
  { word = "same", syll = 1},
}

for _,test in pairs(tests) do
  local resultSyll = CountSyllables(test.word)
  assert(resultSyll == test.syll,
    "Word: "..test.word.."\n"..
    "Expected: "..test.syll.."\n"..
    "Result: "..resultSyll)
end

print("Tests passed.")

আমি আরও দুটি পরীক্ষার কেস "শেষ" এবং "আমি" যুক্ত করেছি। ফিক্সটি ছিল সংবেদনশীলতার সাথে স্ট্রিং কেসের তুলনা করা। পিং'ইং @ জো-বাসিরিকো এবং টিহামার যদি তারা একই সমস্যায় ভোগেন এবং তাদের কাজগুলি আপডেট করতে চান।
জোসেফনাপট

@ হাইহামার আমেরিকান 4 টি সিলেবল!
জোসেফনাপট

2

সিলেবলগুলি গণনা করার জন্য আমি পর্যাপ্ত উপায় খুঁজে পাইনি, তাই আমি নিজেই একটি পদ্ধতি নকশা করেছি।

আপনি আমার পদ্ধতিটি এখানে দেখতে পারেন: https://stackoverflow.com/a/32784041/2734752

সিলেবলগুলি গণনা করার জন্য আমি একটি অভিধান এবং অ্যালগরিদম পদ্ধতির সংমিশ্রণ ব্যবহার করি।

আপনি আমার লাইব্রেরিটি এখানে দেখতে পারেন: https://github.com/troywatson/Lawrence-Style-Checker

আমি সবেমাত্র আমার অ্যালগরিদম পরীক্ষা করেছি এবং তার একটি 99.4% স্ট্রাইক রেট ছিল!

Lawrence lawrence = new Lawrence();

System.out.println(lawrence.getSyllable("hyphenation"));
System.out.println(lawrence.getSyllable("computer"));

আউটপুট:

4
3

1
সাধারণত, কোনও সরঞ্জাম বা লাইব্রেরির লিঙ্কগুলির সাথে ব্যবহারের নোটগুলি, সংযুক্ত সংস্থানটি সমস্যার ক্ষেত্রে কীভাবে প্রযোজ্য হবে তার একটি নির্দিষ্ট ব্যাখ্যা, বা কিছু নমুনা কোড , বা সম্ভব হলে উপরের সমস্তটি দিয়ে থাকতে হবে।
আইকনাগ

সিনট্যাক্স হাইলাইটিং দেখুন । এসও সম্পাদকটিতে একটি সহায়তা বোতাম (প্রশ্ন চিহ্ন) রয়েছে যা আপনাকে লিঙ্কযুক্ত পৃষ্ঠায় নিয়ে যাবে।
আইকনাগ

0

প্রচুর পরীক্ষা-নিরীক্ষা করার পরেও হাইফেনেশন প্যাকেজগুলি চেষ্টা করার পরে, আমি বেশ কয়েকটি উদাহরণের ভিত্তিতে আমার নিজের লিখেছি। আমিও চেষ্টা pyhyphenএবং pyphenহাইফেন অভিধান সাথে প্যাকেজ যে ইন্টারফেস, কিন্তু তারা অনেক ক্ষেত্রে সিলাবল ভুল সংখ্যক উত্পাদন। nltkপ্যাকেজ কেবল এই ব্যবহারের ক্ষেত্রে জন্য খুব মন্থর ছিল।

পাইথনে আমার বাস্তবায়ন আমার লেখা ক্লাসের একটি অংশ এবং সিলেবল গণনার রুটিনটি নীচে আটকানো হয়েছে। এটি সিলেবলের সংখ্যাটিকে কিছুটা বেশি অনুমান করে কারণ এখনও আমি নীরব শব্দের সমাপ্তির জন্য অ্যাকাউন্ট করার ভাল উপায় খুঁজে পাইনি।

ফ্লেশ-কিনকাইড পঠনযোগ্যতার স্কোর হিসাবে এটি ব্যবহৃত হয় বলে ফাংশনটি প্রতি শব্দসংক্ষেপের অনুপাত প্রদান করে returns সংখ্যাটি নির্ভুল হতে হবে না, কেবলমাত্র একটি অনুমানের জন্য যথেষ্ট কাছে।

আমার 7 ম প্রজন্মের আই 7 সিপিইউতে, এই ফাংশনটি 751 শব্দের নমুনা পাঠ্যের জন্য 1.1-1.2 মিলি সেকেন্ড নিয়েছিল।

def _countSyllablesEN(self, theText):

    cleanText = ""
    for ch in theText:
        if ch in "abcdefghijklmnopqrstuvwxyz'’":
            cleanText += ch
        else:
            cleanText += " "

    asVow    = "aeiouy'’"
    dExep    = ("ei","ie","ua","ia","eo")
    theWords = cleanText.lower().split()
    allSylls = 0
    for inWord in theWords:
        nChar  = len(inWord)
        nSyll  = 0
        wasVow = False
        wasY   = False
        if nChar == 0:
            continue
        if inWord[0] in asVow:
            nSyll += 1
            wasVow = True
            wasY   = inWord[0] == "y"
        for c in range(1,nChar):
            isVow  = False
            if inWord[c] in asVow:
                nSyll += 1
                isVow = True
            if isVow and wasVow:
                nSyll -= 1
            if isVow and wasY:
                nSyll -= 1
            if inWord[c:c+2] in dExep:
                nSyll += 1
            wasVow = isVow
            wasY   = inWord[c] == "y"
        if inWord.endswith(("e")):
            nSyll -= 1
        if inWord.endswith(("le","ea","io")):
            nSyll += 1
        if nSyll < 1:
            nSyll = 1
        # print("%-15s: %d" % (inWord,nSyll))
        allSylls += nSyll

    return allSylls/len(theWords)

-1

আমি একবার এটি করতে jsoup ব্যবহার করেছি। এখানে একটি নমুনা সিলেবল পার্সার দেওয়া আছে:

public String[] syllables(String text){
        String url = "https://www.merriam-webster.com/dictionary/" + text;
        String relHref;
        try{
            Document doc = Jsoup.connect(url).get();
            Element link = doc.getElementsByClass("word-syllables").first();
            if(link == null){return new String[]{text};}
            relHref = link.html(); 
        }catch(IOException e){
            relHref = text;
        }
        String[] syl = relHref.split("·");
        return syl;
    }

এটি কীভাবে জেনেরিক সিলেবল পার্সার? দেখে মনে হচ্ছে এই কোডটি কেবল একটি অভিধানে অক্ষরের সন্ধান করছে
নিকো হাজেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.