如何在 CountVectorizer() 中使用不同类别的单词

数据挖掘 Python nlp scikit-学习 文本挖掘 可能性
2021-09-26 02:07:50

假设我有一篇文章,我想根据其内容将概率分配给不同的流派(类)。例如

文字#1:喜剧 10%,恐怖 50%,浪漫 1%

文字#2:喜剧 40%,恐怖 3%,浪漫 30%

我们在每个类别中都给出了关键字,我们通过这些关键字进行比较。下面是更好地解释这种情况的代码

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# Comedy
keywords_1 = ['funny', 'amusing', 'humorous', 'hilarious', 'jolly']

# Horror
keywords_2 = ['horror', 'fear', 'shock', 'panic', 'scream']

# Romance
keywords_3 = ['romantic', 'intimate', 'passionate', 'love', 'fond']

text = ('funny hilarious fear passionate')

cv1 = CountVectorizer(vocabulary = keywords_1) 
data = cv1.fit_transform([text]).toarray()
vec1 = np.array(data)
vec2 = np.array([[1, 1, 1, 1, 1]])
print(cosine_similarity(vec1, vec2))

cv2 = CountVectorizer(vocabulary = keywords_2) 
data = cv2.fit_transform([text]).toarray()
vec1 = np.array(data)
vec2 = np.array([[1, 1, 1, 1, 1]])
print(cosine_similarity(vec1, vec2))

cv3 = CountVectorizer(vocabulary = keywords_3) 
data = cv3.fit_transform([text]).toarray()
vec1 = np.array(data)
vec2 = np.array([[1, 1, 1, 1, 1]])
print(cosine_similarity(vec1, vec2))

这种方法的问题是vocabularyinCountVectorizer()没有考虑文本中单词的不同词类(名词、动词、形容词、副词、复数等)。例如,假设我们有如下关键字列表

keywords_1 = [(...), ('amusement', 'amusements', 'amuse', 'amuses', 'amused', 'amusing'), (...), ('hilarious', 'hilariously') (...)]

我们要计算相似度如下

cv1 = CountVectorizer(vocabulary = keywords_1) 
data = cv1.fit_transform([text]).toarray()
vec1 = np.array(data) # [[f1, f2, f3, f4, f5]]) # fi is the count of number of keywords matched in a sublist
vec2 = np.array([[n1, n2, n3, n4, n5]]) # ni is the size of sublist
print(cosine_similarity(vec1, vec2))

我们如何修改上面的代码来捕捉这个场景。任何建议表示赞赏。

2个回答

首先,您的问题是关于另一个答案中提到的词干提取,可以在任何 Python NLP 库中找到,例如SpacyNLTK

这里要提到的另一点是,尽管有其他答案,但图书馆作为停用词列表的内容实际上并不是停用词!不要删除它们在 NLP 中,停用词应该基于工作语料库而不是基于预定义的列表来提取。在实践中,删除这种停用词通常会降低特定领域语料库的性能。

第三点是根据你使用的分类器和损失函数,TF-IDF可能比 Count Vectorizer 更好。我想如果 Log Loss 是成本函数,它会更好地工作,但我不确定。试一试。

如果您想像您的示例一样使用词汇集:

keywords_1 = [
    (...), 
    ('amusement', 'amusements', 'amuse', 'amuses', 'amused', 'amusing'),
    (...), 
    ('hilarious', 'hilariously'),
    (...)
]

我建议你使用词干分析器并在它之前删除停用词