前回の続き - https://blog.csdn.net/m0_49621298/article/details/107603652
2. データ処理
1. フィールド内の改行、スペースなどを削除します。
2. 単語の分割には jieba を使用します。ここでは、さまざまなビジネス シナリオに従って辞書を設計する必要があります。
comment=data['评论'].tolist()
commentArr=[]#存储评论分词
for i in range(len(comment)):#
jieba.load_userdict('./file/自定义词库.txt')
cut=jieba.cut(comment[i])
commentArr.append(list(cut))
3. 中国語の抽出、同義語の置換と統合、句読点の削除など、単語分割後の結果を処理します。
pattern = re.compile(r'[^\u4e00-\u9fa5]')
chinese = []
for review in commentArr:
new_review = []
for token in review:
new_token = re.sub(pattern, '', token)#保留中文
new_token=new_token.replace('安装师傅','师傅')
if not new_token == '':
new_review.append(new_token)
chinese.append(new_review)
4. ストップワードを削除するために必要なストップワードデータベースを作成して追加します。
stopwordArr=[]#停用词
with open('./file/停用词.txt', 'r',encoding='utf-8') as f:
stop_word = f.readlines()
stopwordArr.append(stop_word)
stopwordArr=[i.replace('\n','') for i in stopwordArr[0]]
# print(stopwordArr)
for i in range(len(chinese)):
temparr=[]
for j in range(len(chinese[i])):
if chinese[i][j] not in(stopwordArr):
temparr.append(chinese[i][j])
no_stopword.append(temparr)
5. 処理されたデータは、後で使用できるようにファイルに保存されます。
3. データ分析
1. サブカテゴリのコメント数から売れ筋モデルを調べる
xilei={}
for i in data['细类'].unique():
indices = np.where(data['细类'] == i)
xilei[i]=[len(indices[0]),0]
gailei = np.take(data['clean_word'].values, indices)
sumgailei = np.sum(gailei) # 合并细类下的评论
xilei[i][1]=sumgailei
TOP10は以下の通り
2. キーワードを抽出し、購入者の懸念事項を見つける
for k in xilei.keys():
temparr=[]
tfidf = jieba.analyse.extract_tags(str(xilei[k][1]), topK=10, withWeight=True)
temparr.append(k)
temparr.append(xilei[k][0])
temparr.append([i[0] for i in tfidf])
output.append(temparr)
高頻度ワードのトップ10を見ると、通常の褒め言葉に加えて、「実店舗」「ゴミ」「建一」など注目すべきワードがいくつか含まれていることが分かる。「ジェーンアート」とは、ユーザーが注目する製品の特徴を指します。「実店舗」の元のコメントを確認して得られた情報:まず、オフラインの実店舗が徐々に拡大しており、「オープンしたばかり」という言葉が多くのコメントに現れる; シングル] そのようなプロセス。もう一つの「ゴミ」はちょっと「普通じゃない」もので、こちらは完成後に設置業者が率先してゴミを片付けてくれたというユーザーのコメントが増えました~このサービスの内容にもユーザーの注目が集まっているようです。
3. 評価分類
(1)スノールプ
まずはsnownlpを使って試してみて、ついでに否定的なコメントも見つけて(さまざまな理由から、オンライン製品の否定的なコメントは一般にバランスが悪く、まれです)、他のアルゴリズムのトレーニングセットとして使用します。
def fenlei(text):
s=SnowNLP(text)
return s.sentiments
data['评论分类']=data['评论'].apply(fenlei)
Snownlp によって与えられるスコアは 0 ~ 1 であり、スコアが低いほど負の値になります。最初の 20 エントリをスコアの昇順に読んだ後でも、いくつかの悪いレビューが見つかり、いくつかの誤った判断があり、そのうちの 4 つは上記の高頻度単語「ゴミ」に関するものでした。データセットのほとんどは、収集されたゴミを参照しています。サードパーティライブラリの蔑称である「ゴミ」という言葉をインストーラで削除してみたら、確かに改善されましたね、やはりデータ分析はビジネスベースが必要ですね~ 一見すると約0.000025ポイント以上をプラスとしてカウントする必要があります。
混同マトリックス、ここでは否定的な評価 (まれなカテゴリ) に焦点を当てます。再現率 = 72.7%、精度 = 88.9%、F1 測定値 = 80.0%。悪くないですよ~~ それに、手作業でラベルを貼るのは本当に疲れます!!データ処理部分に加えて、ラベル付けにもデータ分析のビッグヘッドが不可欠です。
なぜ否定的なレビューに注目するのでしょうか? 顧客からの肯定的なコメントの一部は有効期限が切れるとシステムによって自動的にコメントされるため、後で顧客が追加した否定的なコメントは顧客サービスからの応答なしに隠蔽されます。これらの否定的なレビューに焦点を当てると、顧客によるタイムリーな修理につながる可能性があります。量は少ないですが、口コミで1人から10人、10人から100人に広がっていきます。
混同行列 | 予報 | ||
ネガティブな | 正面 | ||
実際のクラス | ネガティブな | 16 | 6 |
正面 | 2 | 1954年 |
(2) ベイジアンとSVMを使って分類してみる
いくつかのネガティブなレッテルをすべて取り出す
neg = data[data['手工标签'] == "负面"]['clean_word'].tolist()
# print(len(neg))#22
negArr=[]
for i in range(len(neg)):
temparr=[]
neg[i]=neg[i].replace('[',"")
neg[i] = neg[i].replace(']', "")
neg[i] = neg[i].replace("'", "")
temparr=neg[i].split(',')
negArr.append(temparr)
バランスのため、表ラベルの 30 個をランダムに選択します。
posindex=np.where(data['手工标签'] == "正面")#查看正面标签的序号
# print(type(posindex[0]))#<class 'numpy.ndarray'>
randompos=random.sample(list(posindex[0]),30)#在正面中随机抽取30个
pos=data.loc[randompos]['clean_word'].tolist()
posArr=[]
for i in range(len(pos)):
temparr=[]
pos[i]=pos[i].replace('[',"")
pos[i] = pos[i].replace(']', "")
pos[i] = pos[i].replace("'", "")
temparr=pos[i].split(',')
posArr.append(temparr)
トレーニングセットを構築する
classVec=[0 if i<30 else 1 for i in range(30+22)]#创建label,1代表负面差评
posnegList=posArr[:]
posnegList.extend(negArr)#合并起来
def features(posnegList):
return dict([(word, True) for word in posnegList])
train=[]#构造训练集
for i in range(len(posnegList)):
train.append((features(posnegList[i]),classVec[i]))
NLTK を使用したベイジアン トレーニング - 必要な入力形式に注意する必要があります
classifier = NaiveBayesClassifier.train(train)
print(classifier.show_most_informative_features(10))