একটি পঠনযোগ্যতা সূচক তৈরি করুন


13

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

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

FRE = 206.835 - 1.015 * (words per sentence) - 84.6 * (syllables per word)

আপনার প্রোগ্রামটি অবশ্যই নীচের রেফারেন্স প্যাসেজগুলির সাথে সংযুক্ত থাকতে হবে, যার সূচকগুলি ম্যানুয়াল গণনা ব্যবহার করে গণনা করা হয়েছিল:

I would not, could not, in the rain.
Not in the dark, not on a train.
Not in a car, not in a tree.
I do not like them, Sam, you see.
Not in a house, not in a box.
Not with a mouse, not with a fox.
I will not eat them here or there.
I do not like them anywhere!

সূচক: 111.38 (sentences২ টি শব্দের মধ্যে sentences৪ টি উচ্চারণ) ৮ টি বাক্যে)

It was a bright cold day in April, and the clocks were striking thirteen.
Winston Smith, his chin nuzzled into his breast in an effort to escape
the vile wind, slipped quickly through the glass doors of Victory Mansions,
though not quickly enough to prevent a swirl of gritty dust from entering
along with him.

সূচক: 65.09 (2 বাক্যে 55 টি শব্দের মধ্যে 74 টি উচ্চারণ)

When in the Course of human events, it becomes necessary for one people to
dissolve the political bands which have connected them with another, and to
assume among the powers of the earth, the separate and equal station to
which the Laws of Nature and of Nature's God entitle them, a decent respect
to the opinions of mankind requires that they should declare the causes
which impel them to the separation.

সূচি: ৩.70০ (এক বাক্যে words১ টি শব্দে ১১০ টি উচ্চারণ)

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


এটি একটি ফাংশন হতে পারে? বা এটি STDIN নিতে হবে?
ব্রিগেন্ড

2
আপনার কাছে কি উদাহরণস্বরূপ 3 টি অনুচ্ছেদে বা কেবল সূচকের জন্য সিলেবল গণনা রয়েছে? আপনার যদি এটি থাকে তবে সিলেবল গণনা তুলনার জন্য কার্যকর হবে।
স্ট্রাইকয়েড

এটি একটি ফাংশন হতে পারে। আসলে এটি ফাংশন হওয়া উচিত।
জো জেড।

উত্তর:


6

পার্ল 120 ​​বাইট

#!perl -pa0
s@\w+|([.!?])@$s+=$#-,lc($&)=~s![aeiou]+\B|([aeiouy]$)!$y+=1-$#-/3!ger@ge}
{$_=206.835-1.015*@F/$s-84.6*$y/@F

নমুনা I / O:

$ perl flesch-kincaid.pl < input1.dat
110.730040322581

$ perl flesch-kincaid.pl < input2.dat
65.6097727272728

$ perl flesch-kincaid.pl < input2.dat
1.71366197183096

প্রতিটি শব্দের ক্লাস্টার একটি শব্দের শেষে একাকী স্বর ব্যতীত, যা কেবল সময়ের দুই তৃতীয়াংশ হিসাবে গণনা করা হয় তা ধরে রেখে সিলেবলের গণনা করা হয়; একটি হিউরিস্টিক যা মোটামুটি সঠিক বলে মনে হচ্ছে।


3

কে ও আর সি - 188 196 199 229 টি অক্ষর

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

স্বরলিপি সনাক্তকরণের জন্য আমি একটি ছোট্ট উপায় খুঁজে পাওয়ার পরে যা দুঃখের সাথে ভিত্তি করে তৈরি হয়েছিল stdchr, আমি বিরক্তিকর হওয়ার দরকার পড়েনি এমন বিট-টুইডলিং ঘৃণা থেকে আমি আরও কয়েক বার গ্রাস করার উত্সাহ পেয়েছিলাম।

d,a,v,s,t,w;float R(char*c){for(;*c;++c){s+=*c=='.';if(isalpha(*c)){
w+=!a++;d=(*c&30)>>1;if(*c&1&(d==7|((!(d&1))&(d<6|d>8)))){t+=!v++;}
else v=0;}else v=a=0;}return 206.835-1.*w/s-82.*t/w;}

এখানে যুক্তি একটি সরল রাষ্ট্রীয় যন্ত্র। এটি বাক্যগুলিকে কেবল পিরিয়ড অনুসারে গণনা করে, বর্ণানুক্রমিক অক্ষরের স্ট্রিং দ্বারা শব্দ এবং শব্দের সাথে স্বরগুলির স্ট্রিং (y সহ) যুক্ত হয়।

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

মন্তব্য এবং কিছু ডিবাগিং সরঞ্জাম সহ আন-গল্ফড :

#include <stdlib.h>
#include <stdio.h>
d,a,/*last character was alphabetic */
  v,/*lastcharacter was a vowel */
  s, /* sentences counted by periods */
  t, /* syllables counted by non-consequtive vowels */
  w; /* words counted by non-letters after letters */
float R/*eadability*/(char*c){
  for(;*c;++c){
    s+=*c=='.';
    if(isalpha(*c)){ /* a letter might mark the start of a word or a
               vowel string */
      w+=!a++; /* It is only the start of a word if the last character
              wasn't a letter */
      /* Extract the four bits of the character that matter in determining
       * vowelness because a vowel might mark a syllable */
      d=(*c&30)>>1;
      if( *c&1  & ( d==7 | ( (!(d&1)) & (d<6|d>8) ) ) 
      ) { /* These bits 7 or even and not 6, 8 make for a
         vowel */
    printf("Vowel: '%c' (mangled as %d [0x%x]) counts:%d\n",*c,d,d,!v);
    t+=!v++;
      } else v=0; /* Not a vowel so set the vowel flag to zero */
    }else v=a=0; /* this input not alphabetic, so set both the
            alphabet and vowel flags to zero... */
  }
  printf("Syllables: %3i\n",t);
  printf("Words:     %3i       (t/w) = %f\n",w,(1.0*t/w));
  printf("Sentences: %3i       (w/s) = %f\n",s,(1.0*w/s));
  /* Constants tweaked here due to bad counting behavior ...
   * were:       1.015     84.6 */
  return 206.835-1.   *w/s-82. *t/w;
}
main(c){
  int i=0,n=100;
  char*buf=malloc(n);
  /* Suck in the whole input at once, using a dynamic array for staorage */
  while((c=getc(stdin))!=-1){
    if(i==n-1){ /* Leave room for the termination */
      n*=1.4;
      buf=realloc(buf,n);
      printf("Reallocated to %d\n",n);
    }
    buf[i++]=c;
    printf("%c %c\n",c,buf[i-1]);
  }
  /* Be sure the string is terminated */
  buf[i]=0;
  printf("'%s'\n",buf);
  printf("%f\n",R/*eadability*/(buf));
}

আউটপুট: (দীর্ঘ সংস্করণ থেকে স্ক্যাফোল্ড ব্যবহার করে তবে গল্ফযুক্ত ফাংশন))

$ gcc readability_golf.c
readability_golf.c:1: warning: data definition has no type or storage class
$ ./a.out < readability1.txt 
'I would not, could not, in the rain.
Not in the dark, not on a train.
Not in a car, not in a tree.
I do not like them, Sam, you see.
Not in a house, not in a box.
Not with a mouse, not with a fox.
I will not eat them here or there.
I do not like them anywhere!
'
104.074631    
$ ./a.out < readability2.txt
'It was a bright cold day in April, and the clocks were striking thirteen.
Winston Smith, his chin nuzzled into his breast in an effort to escape
the vile wind, slipped quickly through the glass doors of Victory Mansions,
though not quickly enough to prevent a swirl of gritty dust from entering
along with him.
'
63.044090
$ ./a.out < readability3.txt 
'When in the Course of human events, it becomes necessary for one people to
dissolve the political bands which have connected them with another, and to
assume among the powers of the earth, the separate and equal station to
which the Laws of Nature and of Nature's God entitle them, a decent respect
to the opinions of mankind requires that they should declare the causes
which impel them to the separation.
'
-1.831667

ঘাটতি:

  • বাক্য গণনা যুক্তিটি ভুল, তবে আমি এটির সাথে দূরে চলে যাই কারণ কেবলমাত্র ইনপুটগুলির একটিতে একটি !বা একটি রয়েছে ?
  • শব্দ গণনা যুক্তি সংকোচন দুটি শব্দ হিসাবে বিবেচনা করবে।
  • উচ্চারণযোগ্য গণনা যুক্তি সেই একই সংকোচনের সাথে একটি সংলাপ হিসাবে বিবেচনা করবে। তবে সম্ভবত গড়ে ওভারকাউন্টগুলি (উদাহরণস্বরূপ thereদুটি হিসাবে গণনা করা হয় এবং শেষ হওয়া অনেক শব্দকে eএকটি খুব বেশি গণনা করা হবে), সুতরাং আমি 96.9% সংশোধনের একটি ধ্রুবক ফ্যাক্টর প্রয়োগ করেছি।
  • একটি ASCII অক্ষর সেট ধরে।
  • আমি বিশ্বাস করি স্বর সনাক্তকরণ স্বীকার করবে [এবং {যা স্পষ্টভাবে সঠিক নয়।
  • কেএন্ডআর শব্দার্থবিজ্ঞানের উপর প্রচুর নির্ভরতা এটিকে অশুভ করে তোলে, তবে ওহে, এটি কোড গল্ফ।

দেখার বিষয়:

  • আমি পার্লটিকে পিছনে নিলেও আমি এখানে অজগর উভয়ের সমাধানের (মুহূর্তে) এগিয়ে আছি।

  • স্বর সনাক্তকরণের জন্য আমি যে ভয়াবহ কাজটি করেছি তার একটি ভার পান। আপনি বাইনারি ASCII উপস্থাপনাগুলি লিখুন এবং দীর্ঘ সংস্করণে মন্তব্যটি পড়লে এটি কিছুটা অর্থপূর্ণ হয়।


"গ্রহণযোগ্য ফলাফল পেতে আমাকে হাতে হাতে সূত্রটি কিছুটা পরিবর্তন করতে হয়েছিল।" এটি খারাপ ফর্ম হতে পারে।
জো জেড।

1
যারা টেক্সট ধী ত্রুটি বরং একটি বিশুদ্ধরূপে চেয়ে তোলে আমি এখন একটি অন্তত অনুসৃত Strigoides 'সীসা এবং প্রণীত ভিত্তিতে সমন্বয় আছে তদর্থক খামচি চুক্তি মধ্যে তিনটি পরীক্ষার বিষয় রিং করতে।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

2

পাইথন, 202 194 188 184 171 167 টি অক্ষর

import re
def R(i):r=re.split;w=len(r(r'[ \n]',i));s=r('\\.',i);y=r('[^aeiou](?i)+',i);return 206.835-1.015*w/(len(s)-s.count('\n'))-84.6*(len(y)-y.count(' ')-2)*.98/w

প্রথমে স্পেস এবং নিউলাইনগুলিতে বিভক্ত হয়ে মোট শব্দের সংখ্যাটি পান:

w=len(r(r'[ \n]',i))

তারপরে, সূত্রটি। বাক্য এবং সিলেবল গণনা কেবল একবার ব্যবহার করা হয়, সুতরাং তারা এই অভিব্যক্তিটিতে এম্বেড করা হয়েছে।

.নতুন লাইনগুলি ফিল্টার আউট সহ প্রবন্ধগুলি কেবল ইনপুট বিভক্ত হয়:

s=r('\\.',i);s=len(s)-s.count('\n')

সিলেবলগুলি ফাঁকা স্থান অপসারণ করে অ-স্বরগুলির সাথে ইনপুট বিভক্ত থাকে। এটি ধারাবাহিক সংখ্যার ধারাবাহিকভাবে সামান্য পরিমাণের চেয়ে বেশি পরিমাণে অনুমান করে বলে মনে হচ্ছে, সুতরাং আমাদের এটিকে সামঞ্জস্য করতে হবে (প্রায় .98 এরকম মনে হচ্ছে):

y=r('[^aeiou](?i)+',i);y=len(y)-y.count(' ')-2;

202 -> 194: এর len(x)-2 চেয়ে বেশি len(x[1:-1])। অপ্রয়োজনীয় বন্ধনীগুলি সরানো হয়েছে। সিলেবল রেজেক্স কেস-সংবেদনশীল তৈরি করেছেন

194 -> 188: ফাইলটি আগে ইউনিক্স ফাইল ফর্ম্যাটের পরিবর্তে ডস হিসাবে সংরক্ষণ করা হয়েছিল, যার ফলে wc -cনিউলাইনগুলিকে দুটি অক্ষর হিসাবে গণনা করা হয়েছিল। উপস।

188 -> 184:x for x in ... if x!=... মধ্যবর্তী ফলাফল সংরক্ষণ করে এবং বিয়োগ করে সেই দুষ্টুগুলি থেকে মুক্তি পানx.count(...)

184 -> 171: ইনপুট / আউটপুট সরান, এবং ফাংশনে রূপান্তর

171 -> 167: সন্নিবেশ len(x)-x.count(...)সূত্র মধ্যে গুলি


আপনার উত্তর ইনপুট এবং আউটপুট পদ্ধতি অন্তর্ভুক্ত করতে হবে না।
জো জেড।

@ জোজেং ওহ, ঠিক আছে আমি তখন এটি একটি ফাংশনে পরিণত করব।
স্ট্রাইকয়েডস

1

পাইথন 380 টি অক্ষর

import re
def t(p):
 q=lambda e: e!=''
 w=filter(q,re.split('[ ,\n\t]',p))
 s=filter(q,re.split('[.?!]',p))
 c=len(w)*1.0
 f=c/len(s)
 return w,f,c
def s(w):
 c= len(re.findall(r'([aeiouyAEIOUY]+)',w))
 v='aeiouAEIOU'
 if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1
 return c
def f(p):
 w,f,c=t(p)
 i=0
 for o in w:
  i+=s(o)
 x=i/c
 return 206.835-1.015*f-84.6*x

এটি বরং দীর্ঘ সমাধান, তবে এটি যথেষ্ট ভালভাবে কাজ করে, কমপক্ষে 3 টি পরীক্ষার ক্ষেত্রে এটি সরবরাহ করে।

পরীক্ষার কোড

def test():
 test_cases=[['I would not, could not, in the rain.\
        Not in the dark, not on a train.\
        Not in a car, not in a tree.\
        I do not like them, Sam, you see.\
        Not in a house, not in a box.\
        Not with a mouse, not with a fox.\
        I will not eat them here or there.\
        I do not like them anywhere!', 111.38, 103.38, 119.38],\
        ['It was a bright cold day in April, and the clocks were striking thirteen.\
        Winston Smith, his chin nuzzled into his breast in an effort to escape\
        the vile wind, slipped quickly through the glass doors of Victory Mansions,\
        though not quickly enough to prevent a swirl of gritty dust from entering\
        along with him.', 65.09, 57.09, 73.09],\
        ["When in the Course of human events, it becomes necessary for one people to\
        dissolve the political bands which have connected them with another, and to\
        assume among the powers of the earth, the separate and equal station to\
        which the Laws of Nature and of Nature's God entitle them, a decent respect\
        to the opinions of mankind requires that they should declare the causes\
        which impel them to the separation.", 3.70, -4.70, 11.70]]
 for case in test_cases:
  fre= f(case[0])
  print fre, case[1], (fre>=case[2] and fre<=case[3])

if __name__=='__main__':
 test()

ফলাফল -

elssar@elssar-laptop:~/code$ python ./golf/readibility.py
108.910685484 111.38 True
63.5588636364 65.09 True
-1.06661971831 3.7 True

আমি এখান থেকে সিলেবল কাউন্টার ব্যবহার করেছি - সিলেবল গণনা করা

আরও একটি পঠনযোগ্য সংস্করণ এখানে উপলব্ধ


1
if len(w)>2 and w[-1]=='e'and w[-2]not in v and w[-3]in v:c-= 1সরল মনের কিন্তু একটি ভাল অনুমান। আমি এটা পছন্দ করি.
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

0

জাভাস্ক্রিপ্ট, 191 বাইট

t=prompt(q=[]);s=((t[m="match"](/[!?.]+/g)||q)[l="length"]||1);y=(t[m](/[aeiouy]+/g)||q)[l]-(t[m](/[^aeiou][aeiou][s\s,'.?!]/g)||q)[l]*.33;w=(t.split(/\s+/g))[l];alert(204-1.015*w/s-84.5*y/w)

প্রথম পরীক্ষার ক্ষেত্রে 112.9 দেয় (সঠিক উত্তরটি 111.4, 1.5 পয়েন্ট দ্বারা বন্ধ)

দ্বিতীয় পরীক্ষার কেস 67 67.৪ দেয় (সঠিক উত্তরটি .1৫.১, ২.৩ পয়েন্ট দিয়ে বন্ধ)

তৃতীয় পরীক্ষার কেসটি 1.7 দেয় (সঠিক উত্তরটি ২.7 পয়েন্ট ছাড়াই 3.7)

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