如何在将训练语料库传递给sklearn中的TfidfVectorizer之前应用自定义词干分析器?

2024-09-29 02:16:50 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的代码,我有一个句子,我想在将它传递给TfidfVectorizer之前对它进行标记化和词干,以最终获得该句子的tf-idf表示:

from sklearn.feature_extraction.text import TfidfVectorizer
import nltk 
from nltk.stem.snowball import SnowballStemmer

stemmer_ita = SnowballStemmer("italian")

def tokenizer_stemmer_ita(text):
    return [stemmer_ita.stem(word) for word in text.split()]

def sentence_tokenizer_stemmer(text):
    return " ".join([stemmer_ita.stem(word) for word in text.split()])

X_train = ['il libro è sul tavolo']

X_train = [sentence_tokenizer_stemmer(text) for text in X_train]

tfidf = TfidfVectorizer(preprocessor=None, tokenizer=None, use_idf=True, stop_words=None, ngram_range=(1,2))
X_train = tfidf.fit_transform(X_train)

# let's see the features
print (tfidf.get_feature_names())

我得到的输出是:

^{pr2}$

如果我改变参数

tokenizer=None

收件人:

tokenizer=tokenizer_stemmer_ita

我评论这句话:

X_train = [sentence_tokenizer_stemmer(text) for text in X_train]

我希望得到相同的结果,但结果不同:

['il', 'il libr', 'libr', 'libr è', 'sul', 'sul tavol', 'tavol', 'è', 'è sul']

为什么?我是否正确地实现了外部词干分析器?似乎,至少,在第一次运行中,停止字(“è”)被删除,即使stopèwords=None。在

[编辑] 正如Vivek建议的那样,问题似乎出在默认的令牌模式上,当tokenizer=None时,它仍然会被应用。因此,如果a在tokenizer_stemmer_ita的开头添加以下两行:

token_pattern = re.compile(u'(?u)\\b\\w\\w+\\b')
text = " ".join( token_pattern.findall(text) )

我应该得到正确的行为,事实上,我是从上面这个简单的例子中得到的,但是对于另一个例子:

X_train = ['0.05%.\n\nVedete?']

我不知道,这两种输出是不同的:

['05', '05 ved', 'ved']

以及

['05', '05 vedete', 'vedete']

为什么?在这种情况下,问号似乎是问题所在,没有它,输出是相同的。在

[编辑2] 似乎我必须先停止,然后应用正则表达式,在这种情况下,两个输出是相同的。在


Tags: textinimportnonefortrainsentenceil
1条回答
网友
1楼 · 发布于 2024-09-29 02:16:50

这是因为TfidfVectorizer中使用的默认标记器模式token_pattern

token_pattern : string

Regular expression denoting what constitutes a “token”, only used if analyzer == 'word'. The default regexp selects tokens of 2 or more alphanumeric characters (punctuation is completely ignored and always treated as a token separator).

所以没有选择字符è

import re
token_pattern = re.compile(u'(?u)\\b\\w\\w+\\b')
print token_pattern.findall('il libro è sul tavolo')

# Output
# ['il', 'libro', 'sul', 'tavolo']

这个默认的token_pattern在标记器为None时使用,正如您所经历的那样。在

相关问题 更多 >