2017-01-17 13 views
0

私はいくつかの言語で書かれた膨大な数の文書を扱っています。私はtf-idfのスコアから文書間のコサイン距離を計算したいと思う。これまでのところ私が持っている:日本語のテキストにTfidfVectorizerを付けたit-idf

from sklearn.feature_extraction.text import TfidfVectorizer 

# The documents are located in the same folder as the script 
text_files = [r'doc1', r'doc2', r'doc3'] 
files = [open(f) for f in text_files] 
documents = [f.read() for f in files] 

vectorizer = TfidfVectorizer(ngram_range=(1,1)) 
tfidf = vectorizer.fit_transform(documents) 
vocabulary = vectorizer.vocabulary_ 

3つの文書doc1doc2doc3は、英語のテキストが含まれている場合は、このアルゴリズムは、魔法のように動作し、vocabularyは確かに、テキストの異なる体からのユニグラムが含まれていません。私はロシア人もやってみました。しかし、日本語のテキストを試してみると、アルゴリズムは意図したとおりに動作しません。

問題は、日本語にはスペースがないため、TfidfVectorizerは単語が何で、それが何でないか理解できません。例えば、私は私のユニグラム語彙にこのようなものを持っているでしょう:

診多索いほ権込真べふり告車クノ般宮えぼぜゆ注携ゆクく供9時ク転組けが意見だった税新規ト復興ひり教台話辞ゃに

これは明らかに文章であり、言葉ではありません。どうすればこの問題を解決できますか?

+0

英語またはロシア語の単語を使用すると、 'documents'リストはどのように見えますか?このようなもの: '' '、' '、' '、' '、' '、' ' – blacksite

+0

各文書はテキストの本文です。何かのように: '[塩の穀物の中に無限の宇宙があります、 '塩はあなたにとって非常に有益です、'私たちの宇宙は唯一のものです ']'ずっと長く。 –

答えて

2

あなたは日本の

jap_tokenizerは、作成機能や thisのようなもののいずれかである
vectorizer = TfidfVectorizer(ngram_range=(1,1), tokenizer=jap_tokenizer) 

のためのトークナイザを提供する必要があります。

+0

あなたのトークナイザの名前を[else](http://www.wikipedia.org/wiki/Jap)にしたいかもしれません。 – blacksite

+1

これは素晴らしいことです!私は代わりに[this](http://tinysegmenter.tuxfamily.org/)ライブラリを使用して終了しました。 'segmenter = tinysegmenter.TinySegmenter() ベクタライザ= TfidfVectorizer(ngram_range =(1,1)、tokenizer = segmenter.tokenize)' –

1

これは基本的に、documentsの英語版のように見える:あなたの日本語のドキュメントについては

documents = ['one word after another', 'two million more words', 'finally almost there'] 

j_doc1j_doc2、およびj_doc3それらを呼び出す、documentsおそらくこのようになります(単なる例;私と一緒にクマ私はランダムな日本語文を作成しなかったので):

documents = ['診多索いほ', '診多索いほ', '台話辞ゃに'] 

現在のトークナイザは、文字列にはない空白を探します。 (それはあなた次第ですが、私はそれが常に各日本語の文字の間にスペースを追加するために、適切なのかどうか分からないと、)より実現可能とすることができる、このようになります文書今

documents = [" ".join(char for char in d) for d in documents] 

:あなたはこれを試すことができます:

documents 
Out[40]: ['診 多 索 い ほ', '診 多 索 い ほ', '台 話 辞 ゃ に'] 

また、別の回答で言及されているように、独自のトークナイザを定義してください。

+0

これはいい答えでした、ありがとうございました@not_a_robot。最適ではありませんが、このソリューションは実装が非常に簡単であり、特に2,3,4グラムが使用されている場合は正常に動作することがあります。 –

関連する問題