我在excel中有一个产品评论/描述列表,我试图根据评论中出现的字词使用Python对它们进行分类。
我使用Pandas将评论和表示产品属于特定分类的单词列表导入Python,然后计算分类单词的出现次数。
对于单个分类词,这一切都可以正常工作,例如'计算机',但我正在努力使它适用于短语,例如'笔记本电脑外壳'。
我已经看了几个答案,但没有一个成功,包括:
根据这里的答案仅使用text.count(['laptop case', 'laptop bag'])
:Counting phrase frequency in Python 3.3.2但是因为你需要拆分不起作用的文本(我想也许text.count也不适用于列表?)
我发现的其他答案只看一个单词的出现。我能做些什么来计算不涉及将文本主体分成单个单词的单词和短语吗?
我目前拥有的代码(适用于个别条款)是:
for i in df1.index:
descriptions = df1['detaileddescription'][i]
if type(descriptions) is str:
descriptions = descriptions.split()
pool.append(sum(map(descriptions.count, df2['laptop_bag'])))
else:
pool.append(0)
print(pool)
答案 0 :(得分:4)
你走在正确的轨道上!您当前正在分成单个单词,这有助于在您指出时查找单个单词的出现次数。要查找长度为n
的短语,您应该将文本拆分为长度为n
的块,称为n-grams
。
为此,请查看NLTK package:
from nltk import ngrams
sentence = 'I have a laptop case and a laptop bag'
n = 2
bigrams = ngrams(sentence.split(), n)
for gram in bigrams:
print(gram)
答案 1 :(得分:0)
Sklearn的CountVectorizer是标准方式
from sklearn.feature_extraction import text
vectorizer = text.CountVectorizer()
vec = vectorizer.fit_transform(descriptions)
如果您想将计数视为dict
:
count_dict = {k:v for k,v in zip(vectorizer.get_feature_names(), vec.toarray()[0]) if v>0}
print (count_dict)
默认为unigrams,您可以使用带有ngram_range
参数的bigrams或更高的ngrams