我使用stanford nlp软件包编写了以下代码。
GenderAnnotator myGenderAnnotation = new GenderAnnotator();
myGenderAnnotation.annotate(annotation);
但是对于“安妮上学”这句话,它无法确定安妮的性别。
申请表的输出是:
[Text=Annie CharacterOffsetBegin=0 CharacterOffsetEnd=5 PartOfSpeech=NNP Lemma=Annie NamedEntityTag=PERSON]
[Text=goes CharacterOffsetBegin=6 CharacterOffsetEnd=10 PartOfSpeech=VBZ Lemma=go NamedEntityTag=O]
[Text=to CharacterOffsetBegin=11 CharacterOffsetEnd=13 PartOfSpeech=TO Lemma=to NamedEntityTag=O]
[Text=school CharacterOffsetBegin=14 CharacterOffsetEnd=20 PartOfSpeech=NN Lemma=school NamedEntityTag=O]
[Text=. CharacterOffsetBegin=20 CharacterOffsetEnd=21 PartOfSpeech=. Lemma=. NamedEntityTag=O]
获得性别的正确方法是什么?
答案 0 :(得分:4)
如果您的命名实体识别器为令牌输出PERSON
,您可以使用(或构建,如果您没有)基于名字的性别分类器。例如,请参阅NLTK库教程页面中的Gender Identification部分。他们使用以下功能:
尽管如此,我预感到使用字符n-gram频率 - 可能达到字符三字符 - 会给你很好的结果。
答案 1 :(得分:2)
有许多方法,nltk cookbook中概述了其中一种方法。
基本上你构建了一个分类器,它从名称中提取一些特征(第一个,最后一个字母,前两个,后两个字母等等),并根据这些特征进行预测。
import nltk
import random
def extract_features(name):
name = name.lower()
return {
'last_char': name[-1],
'last_two': name[-2:],
'last_three': name[-3:],
'first': name[0],
'first2': name[:1]
}
f_names = nltk.corpus.names.words('female.txt')
m_names = nltk.corpus.names.words('male.txt')
all_names = [(i, 'm') for i in m_names] + [(i, 'f') for i in f_names]
random.shuffle(all_names)
test_set = all_names[500:]
train_set= all_names[:500]
test_set_feat = [(extract_features(n), g) for n, g in test_set]
train_set_feat= [(extract_features(n), g) for n, g in train_set]
classifier = nltk.NaiveBayesClassifier.train(train_set_feat)
print nltk.classify.accuracy(classifier, test_set_feat)
此基本测试可为您提供约77%的准确度。
答案 2 :(得分:1)
性别注释器不会将信息添加到文本输出中,但您仍然可以通过代码访问它,如下面的代码段所示:
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,parse,gender");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation document = new Annotation("Annie goes to school");
pipeline.annotate(document);
for (CoreMap sentence : document.get(CoreAnnotations.SentencesAnnotation.class)) {
for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
System.out.print(token.value());
System.out.print(", Gender: ");
System.out.println(token.get(MachineReadingAnnotations.GenderAnnotation.class));
}
}
<强>输出:强>
Annie, Gender: FEMALE
goes, Gender: null
to, Gender: null
school, Gender: null
答案 3 :(得分:0)
尽管先前的答案@Sebastian Schuster与预期的结果有些接近,但似乎与当前的Standford NLP版本不一样
该代码段的更新后的有效示例如下。
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,parse,gender");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation document = new Annotation("Annie goes to school");
pipeline.annotate(document);
for (CoreMap sentence : document.get(CoreAnnotations.SentencesAnnotation.class)) {
for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
System.out.print(token.value());
System.out.print(", Gender: ");
System.out.println(token.get(CoreAnnotations.GenderAnnotation.class));
}
}