使用NLTK或类似法将名词分类为抽象或具体

时间:2015-02-18 02:44:40

标签: python nlp nltk

如何在Python中将名词列表分类为抽象或具体?

例如:

"Have a seat in that chair."

在上面的句子中,chair是名词,可以归类为具体。

4 个答案:

答案 0 :(得分:1)

首先,通过word_tokenize(字符串)对单词进行标记化 然后使用nltk中的pos_tag。

import nltk
from nltk import*

string="Have a seat in that chair."
words=nltk.word_tokenize(string)
nltk.pos_tag(words)

这未经过测试,但我认为它可能与此类似。

答案 1 :(得分:0)

一种简单的方法可能是维护抽象名词词典,对于未知词,请查看后缀-具有以下后缀的词通常是抽象名词:

  1. -船
  2. -主义
  3. -ity
  4. -ness
  5. -年龄
  6. -acy
  7. -ment
  8. 能力等

答案 2 :(得分:0)

尝试使用WordNet via NLTK并浏览您感兴趣的单词的上位词树。WordNet是一个词汇数据库,它根据单词的抽象级别以树状结构组织单词。您可以使用它来获取目标词的更多抽象版本。

例如,以下示例代码告诉您,单词“ chair”属于“ seats”类别,而该类别属于总体类别“ entity”。 另一方面,“愤怒”一词属于“情感”类别。

from nltk.corpus import wordnet as wn
wn.synsets('chair')
wn.synset('chair.n.01').hypernyms()
# [Synset('seat.n.03')]
wn.synset('chair.n.01').root_hypernyms()
# [Synset('entity.n.01')]

wn.synsets('anger')
wn.synset('anger.n.01').hypernyms()
# [Synset('emotion.n.01')]

=>查看NLTK WordNet文档,并尝试使用上位树将单词分类为抽象或具体类别。您将必须定义自己“抽象”或“具体”的确切含义,以及要放入这两个类别中的单词类别。

答案 3 :(得分:0)

我建议使用预训练的词向量训练分类器。

您需要两个库:spacy用于标记文本和提取单词向量,以及scikit-learn用于机器学习:

import spacy
from sklearn.linear_model import LogisticRegression
import numpy as np
nlp = spacy.load("en_core_web_md")

区分具体名词和抽象名词是一项简单的任务,因此您可以通过很少的示例来训练模型:

classes = ['concrete', 'abstract']
# todo: add more examples
train_set = [
    ['apple', 'owl', 'house'],
    ['agony', 'knowledge', 'process'],
]
X = np.stack([list(nlp(w))[0].vector for part in train_set for w in part])
y = [label for label, part in enumerate(train_set) for _ in part]
classifier = LogisticRegression(C=0.1, class_weight='balanced').fit(X, y)

拥有训练有素的模型后,可以将其应用于任何文本:

for token in nlp("Have a seat in that chair with comfort and drink some juice to soothe your thirst."):
    if token.pos_ == 'NOUN':
        print(token, classes[classifier.predict([token.vector])[0]])

结果看起来令人满意:

# seat concrete
# chair concrete
# comfort abstract
# juice concrete
# thirst abstract

您可以通过将模型应用于不同的名词,发现错误并将其添加到正确标签下的训练集中来改进模型。