我有一个带注释的数据集:<Word/Phrase, Ontology Class>
,其中Ontology Class可以是以下{Physical Object, Action, Quantity}
之一。我已经从大型文本语料库为我的特定本体模型手动创建了这个数据集。
因为这个过程是手动的,我确信我可能错过了我的语料库中的一些单词/短语。如果是这种情况,我正在寻找从标记数据集中自动从同一语料库中提取具有“特征”作为这些单词的其他单词的方法。因此,第一项任务是在我开始提取其他单词的任务之前定义“特征”。
我可以使用任何标准技术来实现这一目标吗?
编辑:抱歉。我应该提到这些是WordNet中找不到的特定于域的词。
答案 0 :(得分:1)
看一下NLTK书的chapter 6。根据您所描述的,听起来像基于特征(“特征”)提取的监督分类技术可能是一个不错的选择。从书中可以看出:
如果分类器是基于训练构建的,则称为监督分类器 语料库包含每个输入的正确标签。
您可以使用手动编码的某些数据来训练分类器。它可能看起来像这样:
def word_features(name):
features = {}
features["firstletter"] = name[0].lower()
features["lastletter"] = name[-1].lower()
for letter in 'abcdefghijklmnopqrstuvwxyz':
features["count(%s)" % letter] = name.lower().count(letter)
features["has(%s)" % letter] = (letter in name.lower())
return features
接下来,您可以根据已标记的部分数据训练分类器:
>> words = [('Rock', 'Physical Object'), ('Play', 'Action'), ... ]
>>> featuresets = [(word_features(n), g) for (n,g) in words]
>>> train_set, test_set = featuresets[500:], featuresets[:500]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
您应该训练已标记的一半数据。这样你就可以用另一半来测试分类器的准确性。继续处理这些功能,直到分类器的准确性符合您的要求。
nltk.classify.accuracy(classifier, test_set)
您可以按如下方式检查各个分类:
classifier.classify(word_features('Gold'))
如果您不熟悉NLTK,那么您也可以阅读前面的章节。
答案 1 :(得分:1)
正如jfocht所说,你需要一个分类器才能做到这一点。要训练分类器,您需要一组具有特征及其分类的“事物”训练数据。然后,您可以使用功能输入新的“东西”并进行分类。
这里的踢球者是你没有功能,你只需要单词。一个想法是使用WordNet,这是一个花哨的字典,从单词的定义生成功能。 WordNet的一个最佳功能是它具有单词的层次结构,例如,
cat -> animal -> living thing -> thing ....
可能只需按照层次结构执行此操作即可,但如果不能,则可以从中添加功能并对其进行训练。这可能比使用单词本身作为功能更好。
无论您是否发现Wordnet有用,您都需要一个功能集来训练您的分类器,并且您还必须使用这些功能标记所有未分类的数据,因此除非您有某种方法可以计算特征部分,手工完成这项工作的工作量会减少