私は 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)