it-idf与日文文本上的TfidfVectorizer

时间:2017-01-17 21:53:08

标签: python parsing scikit-learn nlp tf-idf

我正在处理用多种语言编写的大量文档。我想从他们的tf-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_

当三个文档doc1doc2doc3包含英文文本时,算法就像魅力一样,vocabulary确实包含来自不同文本正文的unigrams 。我也尝试过俄语,它也很棒。但是,当我尝试使用一些日文文本时,该算法不再按预期工作。

问题源于日语没有空格,因此TfidfVectorizer不理解什么是单词,什么不是。例如,我的unigram词汇表中会有类似的东西:

  

诊多索いほ権込真べふり告车クノ般宫えぼぜゆ注携ゆクく供9时ク転组けが意见だっあ税新ト复生ひり教台话辞ゃに

Whic显然是一句话,而不是一句话。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您应该为日语

提供一个标记器
vectorizer = TfidfVectorizer(ngram_range=(1,1), tokenizer=jap_tokenizer)

其中jap_tokenizer是您创建的函数或this之类的函数。

答案 1 :(得分:1)

这似乎是documents的英文版,基本上是:

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

对于您的日语文档,请将其称为j_doc1j_doc2j_doc3documents可能看起来像这样(只是一个例子;请耐心等待,因为我没有'打扰随意的日语句子):

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

当前的标记生成器会查找字符串所没有的空格。你可以试试这个:

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

现在文档看起来像这样,这可能更可行(虽然这取决于你,因为我不知道在每个日文字符之间总是添加空格是否合适):<​​/ p>

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

或定义您自己的标记器,如另一个答案中所述。