Apakah penulisnya pria atau wanita?

8

Satu masalah di situs web seperti ini adalah Anda sering tidak tahu apakah Anda berbicara dengan pria atau wanita. Namun, Anda telah menemukan teknik NLP sederhana yang dapat Anda gunakan untuk menentukan jenis kelamin penulis sebuah teks.

Teori

Sekitar 38,1% huruf yang digunakan dalam bahasa Inggris adalah vokal [a, e, i, o, u] (lihat Referensi di bawah ini, yBUKAN vokal dalam hal ini). Oleh karena itu, kami akan mendefinisikan kata apa saja yang setidaknya 40% vokal sebagai kata feminin , dan kata apa pun yang kurang dari 40% vokal sebagai kata maskulin .

Di luar definisi ini kita juga dapat menemukan maskulinitas atau feminitas suatu kata. Biarkan C menjadi jumlah konsonan dalam kata, dan V menjadi jumlah vokal:

  • Jika sebuah kata itu feminin, itu feminininya 1.5*V/(C+1).
  • Jika sebuah kata adalah maskulin, itu adalah maskulinitas C/(1.5*V+1).

Misalnya, kata catchitu maskulin. Maskulinitasnya adalah 4/(1.5*1+1) = 1.6. Kata phoneitu feminin. Kewanitaannya adalah 1.5*2/(3+1) = .75.

Algoritma

Untuk mengetahui jenis kelamin penulis dari sebuah teks, kita mengambil jumlah maskulinitas dari semua kata maskulin (Σ M ), dan jumlah feminitas dari semua kata feminin (Σ F ). Jika Σ M > Σ F , kami telah menentukan bahwa penulisnya adalah laki-laki. Kalau tidak, kami telah menentukan bahwa penulisnya adalah perempuan.

Tingkat kepercayaan diri

Akhirnya, kita membutuhkan tingkat kepercayaan. Jika Anda telah menentukan bahwa penulisnya adalah wanita, tingkat kepercayaan diri Anda adalah . Jika Anda telah menentukan bahwa penulisnya adalah laki-laki, tingkat kepercayaannya adalah .2*ΣF/(ΣFM)-12*ΣM/(ΣFM)-1

Memasukkan

Input adalah bagian dari teks bahasa Inggris termasuk tanda baca. Semua kata dipisahkan oleh spasi (Anda tidak perlu khawatir tentang baris baru atau spasi tambahan). Beberapa kata memiliki karakter non-huruf di dalamnya, yang perlu Anda abaikan (seperti "Anda"). Jika Anda menemukan kata yang semuanya non-huruf (seperti "5" atau "!!!") abaikan saja. Setiap input akan mengandung setidaknya satu kata yang dapat digunakan.

Keluaran

Anda perlu menghasilkan M atau F tergantung pada jenis kelamin yang Anda pikir penulis, diikuti oleh tingkat kepercayaan diri Anda.

Contohnya

  1. There's a snake in my boot.

    • Jenis kelamin + maskulinitas / feminitas setiap kata: [M1.0,F1.5,F.75,F.75,M2.0,F1.0]
    • Σ M = 3.0, Σ F = 4.0
    • CL: 2*4.0/(4.0+3.0)-1= .143
    • Keluaran: F .143
  2. Frankly, I don't give a ^$*.

    • [M2.4,F1.5,M1.2,F1.0,F1.5], Σ M = 3.6, Σ F = 4.0, CL: 2*4.0/(4.0+3.6)-1= .053, Output:F .053
  3. I'm 50 dollars from my goal!

    • [F.75,M1.25,M1.2,M2.0,F1.0], Σ M = 4.45, Σ F = 1.75, CL: 2*4.45/(4.45+1.75)-1= .435, Output:M .435

Referensi

  1. Persentase vokal dalam kata-kata kamus Bahasa Inggris (38.1%)
  2. Persentase vokal dalam teks bahasa Inggris (38,15%)
geokavel
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

Jawaban:

5

Python 3 , 320 317 307 286 253 189 byte

h=S=0
for v in input().split():V=sum(map(v.count,'aeiouAEIOU'));C=sum(x.isalpha()for x in v);H=V<.4*C;C-=V;K=[1.5*V/(C+1),C/(1.5*V+1)][H];h+=K*H;S+=K-K*H
print('FM'[h>S],2*max(S,h)/(S+h)-1)

Cobalah online!

Tidak Disatukan :

def evaluateWord(s):
    V = len([*filter(lambda c: c in 'aeiou', s.lower())])
    C = len([*filter(lambda c: c in 'bcdfghjklmnpqrstvxzwy', s.lower())])
    isMasculine = V < 0.4*(V+C)
    return C/(1.5*V+1) if isMasculine else 1.5*V/(C+1), isMasculine


def evaluatePhrase(s):
    scores = []
    for word in s.split():
        scores.append(evaluateWord(word))
    masc = 0
    fem = 0
    for score in scores:
        if score[1]:
            masc += score[0]
        else:
            fem += score[0]
    return ('M', 2*masc/(fem+masc)-1) if masc > fem else ('F', 2*fem/(fem+masc)-1)


print(evaluatePhrase("There's a snake in my boot."))
tukang sihir
sumber
1
Anda dapat menyimpan 4 byte dengan menggunakan titik koma dan meletakkan semua fungsi pertama pada satu baris. Cobalah online!
Kamerad SparklePony
@ComradeSparklePony terima kasih!
wrymug
1
map(e,s.split())alih-alih[e(x)for x in s.split()]
Value Ink
1
Juga, lebih baik untuk return'FM'[h>S],2*max(S,h)/(S+h)-1di akhir
Nilai Tinta
1
Saya mencari cara yang lebih efisien untuk menghitung vokal / konsonan melalui sum(map(s.count,chars)), menurunkan jumlah Anda hingga 253 byte
Value Ink
4

Rubi , 154 + 1 = 155 byte

Menggunakan -nbendera.

m=f=0
gsub(/\S+/){s=$&.gsub(/[^a-z]/i){}.upcase;k=s.size;v=s.count'AEIOU';v<k*0.4?m+=(k-v)/(1.5*v+1):f+=1.5*v/(k-v+1)}
puts m>f ??M:?F,2*[m,f].max/(m+f)-1

Cobalah online!

Nilai Tinta
sumber
4

Python 3 , 205 201 197 192 byte

-Terima kasih @ Nilai Tinta untuk 4 byte: lower()sebelumnya
-Terima kasih @Coty Johnathan Saxman untuk 9 byte: Kondisi terbalik .4*(v+c)>vdan -~cuntuk (c+1)cek konsonan berbasis bithift bukan literal.

Python 3 , 192 byte

M=F=0
for i in input().lower().split():
 v=sum(j in'aeiou'for j in i);c=sum(33021815<<98>>ord(k)&1for k in i)
 if.4*(v+c)>v:M+=c/(1.5*v+1)
 else:F-=1.5*v/~c
print('FM'[M>F],2*max(M,F)/(F+M)-1)

Cobalah online!

officialaimm
sumber
1
for i in input().lower().split():sehingga Anda hanya perlu mencari 'aeiou'jumlah vokal dan memotong lowerpanggilan dalam jumlah konsonan.
Nilai Tinta
1
Di 'lain' Anda, pembagi (c +1) dapat disingkat menjadi - ~ c, tanpa tanda kurung, menyimpan byte. Negatif ini kemudian dapat dibawa ke + = Anda, menjadikannya a - = dan menyimpan satu byte lagi. F- = 1,5 * v / ~ c
Coty Johnathan Saxman
1
Mengubah urutan ketidaksetaraan Anda (dalam pernyataan if Anda) menghemat satu byte lagi karena Anda dapat menghapus spasi. if.4 * (v + c)> v
Coty Johnathan Saxman
1
Ini rumit, tetapi Anda dapat menghemat 5 byte dengan mengganti konsonan pencarian Anda untuk tabel pencarian biner hardcoded. k in'bcdfghjklmnpqrstvxzwy'for k ... menjadi 33021815 <<98>> ord (k) & 1 untuk k ... [ tio.run/… Coba online!]
Coty Johnathan Saxman
1

C (gcc) , 237 229 222 216 byte

Boy I meskipun saya bisa melakukan ini dalam BANYAK KURANG BYTES ...

v,c;float m,f;g(char*s){for(m=f=0;*s;v*1.0/(c+v)<.4?m+=c/(1.5*v+1):1?f+=1.5*v/(c+1):0,s+=*s!=0)for(v=c=0;*s&&*s^32;s++)isalpha(*s)?strchr("AaEeIiOoUu",*s)?++v:++c:0;printf("%c %.3f",m>f?77:70,(m>f?2*m:2*f)/(f+m)-1);}

Cobalah online!

Cleblanc
sumber
196 byte
ceilingcat
0

Gangguan Umum, 404 byte

(defun f(x &aux(a 0)c(f 0)m v u)(labels((w(x &aux(p(position #\  x)))(cons(#1=subseq x 0 p)(and p(w(#1#x(1+ p)))))))(dolist(e(w(coerce x'list)))(setf v(#2=count-if(lambda(x)(member x(coerce"aeiouAEIOU"'list)))e)u(#2#'alpha-char-p e)c(- u v)m(and(> c 0)(<(/ v c)4/6)))(and(> u 0)(if m(incf a(/ c(1+(* v 3/2))))(incf f(/ v 2/3(1+ c))))))(format t"~:[F~;M~] ~4f~%"(> a f)(-(/(* 2(if(> a f)a f))(+ a f))1))))

Baik verbose lisp tua!

Cobalah online!

Versi tidak disatukan:

(defun f(x &aux (a 0) c (f 0) m v u)        ; parameter & auxiliary variables
  (labels ((w (x &aux (p (position #\  x))) ; recursive function to split input into words
              (cons (subseq x 0 p) (and p (w (subseq x (1+ p)))))))
    (dolist (e (w (coerce x 'list)))        ; for each word 
      (setf v (count-if (lambda (x) (member x(coerce"aeiouAEIOU"'list))) e) ; count vowels
            u (count-if 'alpha-char-p e)    ; count all alfabetic letters
            c (- u v)                       ; calculate consonants
            m (and (> c 0) (< (/ v c) 4/6))); is male or not?
      (and (> u 0)                          ; if non-empty word
           (if m
               (incf a (/ c (1+ (* v 3/2)))); increase masculinity
               (incf f (/ v 2/3 (1+ c)))))) ; increase femininity
    (format t "~:[F~;M~] ~4f"               ; print
              (> a f)                       ; “gender”
              (-(/ (* 2 (if (> a f)a f)) (+ a f)) 1))))  ; and confidence
Renzo
sumber