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

sin*_*alc 6 python nlp nltk

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

例如:

"Have a seat in that chair."
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ale 5

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

您需要两个库: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)

这没有经过测试,但我认为它可能几乎像这样。

  • 感谢您的回复@Arnold Chung。据我了解,词性标注器将识别句子中的名词,但不会指定名词的类型。例如,“在那张椅子上有一个座位”被标记为“Have/VBP a/DT Seat/NN in/IN that/DT chair/NN”,其中椅子被识别为名词,但名词类型仍然未知。..? (5认同)