作家は男性か女性か?

このようなウェブサイト上の1つの問題は、あなたが男性か女性かを話しているかどうかはよく分かりません。しかし、あなたはテキストの作家の性別を判断するのに使うことができる簡単なNLPテクニックを考え出しました。

理論

英語で使用される文字の約38.1%は [a、e、i、o、u]
です(下記の参考文献を参照してください、この場合は y
は母音ではありません)。したがって、少なくとも40%の母音を女性語と定義し、40%未満の母音を男性語として定義します。

この定義以外にも、単語の男性性または女性性を見つけることができます。単語の子音の数を
C とし、母音の数を V とします。

  • 単語が女性なら女性は 1.5 * V /(C + 1)です。
  • 単語が男性的な場合、男性性は C /(1.5 * V + 1)です。

たとえば、 catch という言葉は男性的です。その男性性は 4 /(1.5 * 1 +
1)= 1.6
です。単語 phone は女性です。その女性性は 1.5 * 2
/(3 + 1)= .75
です。

アルゴリズム

To figure out the gender of the writer of a piece of text, we
take the sum of the masculinity of all the masculine words
M), and the sum of the femininity of all the feminine
words (ΣF). If ΣM > ΣF, we have
determined that the writer is a male. Otherwise, we have determined
that the writer is a female.

信頼水準

Finally, we need a 信頼水準. If you have determined that the writer
is female, your 信頼水準 is
2*ΣF/(ΣFM)-1. If
you have determined that the writer is male, the 信頼水準 is
2*ΣM/(ΣFM)-1.

入力

入力 is a piece of English text including punctuation. Words are
all separated by spaces (You don’t have to worry about new-lines or
extra spaces). Some words have non-letter characters in them, which
you need to ignore (such as “You’re”). If you encounter a word that
is all non-letters (like “5” or “!!!”) just ignore it. Every 入力
will contain at least one usable word.

出力

You need to 出力 an M or F depending on which gender you think the
writer is, followed by your 信頼水準.

  1. There's a snake in my boot.

    • Gender + masculinity/femininity of each word:
      [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
    • 出力: 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, 出力:
      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,
      出力: M .435

参考文献

  1. Percentage of vowels in English dictionary
    words
    (38.1%)
  2. Percentage of vowels in English texts
    (38.15%)
ベストアンサー

Python 3, 320 317
307 286 253 189 bytes

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)

オンラインで試してみてください!

Ungolfed:

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

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です