Sklearn TFIDF中文计算问题以及解决方法

我在使用sklearn中的ITIDF工具,想来这是在文本处理中常用的有个现成的工具一定是极好的。但是网上查了下代码试了下并没有得到跟他们一样的结果。现象是这样的,凡是输入的是中文就直接被忽略掉了,如果全是中文就直接空输入了。当然,前提已经排除掉是编码或者unicode的错误了。

网上搜到的代码参考:

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
    corpus=[
            u'我 来到 北京 清华大学',#第一类文本切词后的结果,词之间以空格隔开
            u'他 来到 了 网易 杭研 大厦',#第二类文本的切词结果
            u'小明 硕士 毕业 与 中国 科学院',#第三类文本的切词结果
            u'我 爱 北京 天安门'
           ]#第四类文本的切词结果
    vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
    transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
    x = vectorizer.fit_transform(corpus)
    l=vectorizer.get_feature_names()
    for u in l:
        print u
    tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
    word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
    weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
    for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print u"-------这里输出第",i,u"类文本的词语tf-idf权重------"
for j in range(len(word)):
print word[j],weight[i][j]

解决方式:打开C:\Python27\Lib\site-packages\sklearn\feature_extraction\text.py中的init函数改成 def __init__(self, input='content', charset='utf-8',
                 charset_error='strict', strip_accents=None,
                 lowercase=True, preprocessor=None, tokenizer=None,
                 stop_words=None,token_pattern=ur"\b\w\w+\b" ,
                 min_n=1, max_n=1, analyzer=(lambda s: s.split()),#analyzer='word',
                 max_df=1.0, max_features=None,
                 vocabulary=None, binary=False, dtype=long):

即把analyzer参数中原来的word改为(lambda s: s.split()), 也可以根据说明书中http://scikit-learn.org/stable/modules/feature_extraction.html的some tips and tricks中说的那样改成str.split,但这样是不能处理unicode的,如果改为unicode.split则需要在所有str前面多加u,这样很麻烦。不如使用lamda匿名函数可以处理所有类型的字符。

你可能感兴趣的:(科研工具及FAQ)