web-dev-qa-db-ja.com

ユーザー警告:stop_wordsが前処理と矛盾している可能性があります

私は this ドキュメントクラスタリングチュートリアルに従っています。入力として、ダウンロード可能なtxtファイルを提供します here 。これは、\ nを使用して分割された他の3つのtxtファイルの結合ファイルです。 tf-idfマトリックスを作成した後、次の警告を受け取りました。

, UserWarning:stop_wordsが前処理と一致していない可能性があります。ストップワード生成トークンのトークン化['abov'、 'afterward'、 'alon'、 'alreadi'、 'alway'、 'ani'、 'anoth'、 'anyon'、 'anyth'、 'anywher'、 'becam' 、「becaus」、「becom」、「befor」、「besid」、「cri」、「describ」、「dure」、「els」、「elsewher」、「empti」、「everi」、「everyon」、「 everyth '、' everywher '、' fifti '、' forti '、' henc '、' hereaft '、' herebi '、' howev '、' hundr '、' inde '、' mani '、' meanwhil '、' moreov ' 、「nobodi」、「noon」、「noth」、「nowher」、「onc」、「onli」、「otherwis」、「ourselv」、「perhap」、「pleas」、「sever」、「sinc」、「 sincer、sixti、someon、someth、sometim、somewher、themselv、thenc、thereaft、therebi、therefor、togeth、twelv 、「twenti」、「veri」、「whatev」、「whenc」、「whenev」、「wherea」、「whereaft」、「wherebi」、「wherev」、「whi」、「yourselv」]はstop_wordsにはありません。 「stop_words」。 %ソート済み(不整合))」。

それは、見出し語化とストップワードの削除の順序に関係していると思いますが、これはtxt処理における私の最初のプロジェクトであるため、少し迷っていて、これを修正する方法がわかりません...

import pandas as pd
import nltk
from nltk.corpus import stopwords
import re
import os
import codecs
from sklearn import feature_extraction
import mpld3
from nltk.stem.Snowball import SnowballStemmer
from sklearn.feature_extraction.text import TfidfVectorizer


stopwords = stopwords.words('english')
stemmer = SnowballStemmer("english")

def tokenize_and_stem(text):
    # first tokenize by sentence, then by Word to ensure that punctuation is caught as it's own token
    tokens = [Word for sent in nltk.sent_tokenize(text) for Word in nltk.Word_tokenize(sent)]
    filtered_tokens = []
    # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
    for token in tokens:
        if re.search('[a-zA-Z]', token):
            filtered_tokens.append(token)
    stems = [stemmer.stem(t) for t in filtered_tokens]
    return stems


def tokenize_only(text):
    # first tokenize by sentence, then by Word to ensure that punctuation is caught as it's own token
    tokens = [Word.lower() for sent in nltk.sent_tokenize(text) for Word in nltk.Word_tokenize(sent)]
    filtered_tokens = []
    # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
    for token in tokens:
        if re.search('[a-zA-Z]', token):
            filtered_tokens.append(token)
    return filtered_tokens


totalvocab_stemmed = []
totalvocab_tokenized = []
with open('shortResultList.txt', encoding="utf8") as synopses:
    for i in synopses:
        allwords_stemmed = tokenize_and_stem(i)  # for each item in 'synopses', tokenize/stem
        totalvocab_stemmed.extend(allwords_stemmed)  # extend the 'totalvocab_stemmed' list
        allwords_tokenized = tokenize_only(i)
        totalvocab_tokenized.extend(allwords_tokenized)

vocab_frame = pd.DataFrame({'words': totalvocab_tokenized}, index = totalvocab_stemmed)
print ('there are ' + str(vocab_frame.shape[0]) + ' items in vocab_frame')
print (vocab_frame.head())

#define vectorizer parameters
tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=200000,
                                 min_df=0.2, stop_words='english',
                                 use_idf=True, tokenizer=tokenize_and_stem, ngram_range=(1,3))

with open('shortResultList.txt', encoding="utf8") as synopses:
    tfidf_matrix = tfidf_vectorizer.fit_transform(synopses) #fit the vectorizer to synopses

print(tfidf_matrix.shape)

私はPT-BR言語のためにこの問題に直面しました。

TL; DR:言語のアクセントを削除します。

# Special thanks for the user Humberto Diogenes from Python List (answer from Aug 11, 2008)
# Link: http://python.6.x6.nabble.com/O-jeito-mais-rapido-de-remover-acentos-de-uma-string-td2041508.html

# I found the issue by chance (I swear, haha) but this guy gave the tip before me
# Link: https://github.com/scikit-learn/scikit-learn/issues/12897#issuecomment-518644215

import spacy
nlp = spacy.load('pt_core_news_sm')

# Define default stopwords list
stoplist = spacy.lang.pt.stop_words.STOP_WORDS

def replace_ptbr_char_by_Word(word):
  """ Will remove the encode token by token"""
    Word = str(Word)
    Word = normalize('NFKD', Word).encode('ASCII','ignore').decode('ASCII')
    return Word

def remove_pt_br_char_by_text(text):
  """ Will remove the encode using the entire text"""
    text = str(text)
    text = " ".join(replace_ptbr_char_by_Word(word) for Word in text.split() if Word not in stoplist)
    return text

df['text'] = df['text'].apply(remove_pt_br_char_by_text)

この要点にソリューションと参照を入れます。

1
Flavio