Nhà văn là đàn ông hay phụ nữ?


8

Một vấn đề trên một trang web như thế này là bạn thường không biết mình đang nói chuyện với nam hay nữ. Tuy nhiên, bạn đã đưa ra một kỹ thuật NLP đơn giản mà bạn có thể sử dụng để xác định giới tính của người viết một đoạn văn bản.

Học thuyết

Khoảng 38,1% chữ cái được sử dụng trong tiếng Anh là nguyên âm [a, e, i, o, u] (xem Tài liệu tham khảo bên dưới, yKHÔNG phải là nguyên âm trong trường hợp này). Do đó, chúng tôi sẽ định nghĩa bất kỳ từ nào có ít nhất 40% nguyên âm là một từ nữ tính và bất kỳ từ nào dưới 40% nguyên âm là một từ nam tính .

Ngoài định nghĩa này, chúng ta cũng có thể tìm thấy sự nam tính hay nữ tính của một từ. Gọi C là số phụ âm trong từ và V là số nguyên âm:

  • Nếu một từ là nữ tính, thì đó là nữ tính 1.5*V/(C+1).
  • Nếu một từ là nam tính, thì đó là nam tính C/(1.5*V+1).

Ví dụ, từ catchnày là nam tính. Nam tính của nó là 4/(1.5*1+1) = 1.6. Từ phonenày là nữ tính. Nữ tính của nó là 1.5*2/(3+1) = .75.

Thuật toán

Để tìm ra giới tính của nhà văn của một đoạn văn bản, chúng tôi lấy tổng số nam tính của tất cả các từ nam tính (Σ M ) và tổng số nữ tính của tất cả các từ nữ tính ( F ). Nếu Σ M > F , chúng tôi đã xác định rằng nhà văn là nam giới. Mặt khác, chúng tôi đã xác định rằng nhà văn là một phụ nữ.

Mức độ tự tin

Cuối cùng, chúng ta cần một mức độ tự tin. Nếu bạn đã xác định rằng nhà văn là nữ, mức độ tự tin của bạn là . Nếu bạn đã xác định rằng nhà văn là nam giới, mức độ tự tin là .2*ΣF/(ΣFM)-12*ΣM/(ΣFM)-1

Đầu vào

Đầu vào là một đoạn văn bản tiếng Anh bao gồm cả dấu câu. Các từ được phân tách bằng dấu cách (Bạn không phải lo lắng về dòng mới hoặc khoảng trắng thừa). Một số từ có các ký tự không phải chữ cái trong đó, mà bạn cần bỏ qua (chẳng hạn như "Bạn là"). Nếu bạn gặp một từ không phải là tất cả các chữ cái (như "5" hoặc "!!!"), hãy bỏ qua nó. Mỗi đầu vào sẽ chứa ít nhất một từ có thể sử dụng.

Đầu ra

Bạn cần xuất M hoặc F tùy thuộc vào giới tính mà bạn nghĩ là nhà văn, theo sau là mức độ tự tin của bạn.

Ví dụ

  1. There's a snake in my boot.

    • Giới tính + nam tính / nữ tính của mỗi từ: [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
    • Đầu ra: 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, Kết quả: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, Đầu ra:M .435

Người giới thiệu

  1. Tỷ lệ nguyên âm trong các từ trong tiếng Anh (38,1%)
  2. Tỷ lệ nguyên âm trong các văn bản tiếng Anh (38,15%)

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

Câu trả lời:


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)

Hãy thử trực tuyến!

Ung dung :

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."))

1
Bạn có thể lưu 4 byte bằng cách sử dụng dấu chấm phẩy và đặt tất cả hàm đầu tiên trên một dòng. Hãy thử trực tuyến!
Đồng chí SparklePony

@ComradeSparklePony cảm ơn!
wrymug

1
map(e,s.split())thay vì[e(x)for x in s.split()]
Ink Ink

1
Ngoài ra, tốt hơn là return'FM'[h>S],2*max(S,h)/(S+h)-1vào cuối
Ink Ink

1
Tôi đã tìm kiếm một cách hiệu quả hơn để đếm nguyên âm / phụ âm thông qua sum(map(s.count,chars)), giảm số lượng của bạn xuống còn 253 byte
Ink Ink


4

Python 3 , 205 201 197 192 byte

-Cảm ơn @value Ink cho 4 byte: lower()trước
-Cảm ơn @Coty Johnathan Saxman 9 byte: tình trạng Inverted .4*(v+c)>v-~ccho (c+1)kiểm tra phụ âm bitshift dựa trên thay vì chữ.

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)

Hãy thử trực tuyến!


1
for i in input().lower().split():do đó bạn chỉ cần tìm kiếm 'aeiou'số nguyên âm và cắt lowercuộc gọi trong số phụ âm.
Mực giá trị

1
Trong 'other' của bạn, số chia (c + 1) có thể được rút ngắn thành - ~ c, không có dấu ngoặc đơn, tiết kiệm một byte. Sau đó, âm này có thể được chuyển đến + = của bạn, biến nó thành - = và lưu thêm một byte. F- = 1,5 * v / ~ c
Coty Johnathan Saxman

1
Chuyển đổi thứ tự bất đẳng thức của bạn (trong câu lệnh if) giúp bạn tiết kiệm thêm một byte vì bạn có thể xóa khoảng trắng. if.4 * (v + c)> v
Coty Johnathan Saxman

1
Đây là một mẹo khó, nhưng bạn có thể tiết kiệm 5 byte bằng cách chuyển đổi tra cứu phụ âm của bạn cho bảng tra cứu nhị phân được mã hóa cứng. k in'bcdfghjklmnpqrstvxzwy'for k ... trở thành 33021815 << 98 >> ord (k) & 1for k ... [ tio.run/. Hãy thử trực tuyến!]
Coty Johnathan Saxman 18/07/17

1

C (gcc) , 237 229 222 216 byte

Chàng trai tôi mặc dù tôi có thể làm điều này trong RẤT NHIỀU BÀI HỌC ...

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);}

Hãy thử trực tuyến!



0

Lisp thường gặp, 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))))

Tốt cũ verbose lisp!

Hãy thử trực tuyến!

Phiên bản bị đánh cắp:

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.