如何在Python中将名词列表分类为抽象或具体?
例如:
"Have a seat in that chair."
在上面的句子中,chair
是名词,可以归类为具体。
答案 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)
一种简单的方法可能是维护抽象名词词典,对于未知词,请查看后缀-具有以下后缀的词通常是抽象名词:
答案 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
您可以通过将模型应用于不同的名词,发现错误并将其添加到正确标签下的训练集中来改进模型。