如何在Python中将名词列表分类为抽象或具体?
例如:
"Have a seat in that chair."
Run Code Online (Sandbox Code Playgroud)
上面的句子chair是名词,可以归类为具体的.
我建议使用预训练的词向量来训练分类器。
您需要两个库:spacy用于标记文本和提取词向量,以及scikit-learn用于机器学习:
import spacy
from sklearn.linear_model import LogisticRegression
import numpy as np
nlp = spacy.load("en_core_web_md")
Run Code Online (Sandbox Code Playgroud)
区分具体名词和抽象名词是一项简单的任务,因此您可以用很少的示例来训练模型:
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)
Run Code Online (Sandbox Code Playgroud)
当您拥有训练有素的模型后,您可以将其应用于任何文本:
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]])
Run Code Online (Sandbox Code Playgroud)
结果看起来令人满意:
# seat concrete
# chair concrete
# comfort abstract
# juice concrete
# thirst abstract
Run Code Online (Sandbox Code Playgroud)
您可以通过将模型应用于不同的名词、发现错误并将其添加到正确标签下的训练集中来改进模型。
Arn*_*ung -4
首先,通过 word_tokenize(string) 对单词进行标记,然后使用 nltk 中的 pos_tag。
import nltk
from nltk import*
string="Have a seat in that chair."
words=nltk.word_tokenize(string)
nltk.pos_tag(words)
Run Code Online (Sandbox Code Playgroud)
这没有经过测试,但我认为它可能几乎像这样。