我正在使用用多种语言编写的大量文档。我想根据文档的 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_
当三个文档doc1
、doc2
和doc3
包含英文文本时,算法就像一个魅力,vocabulary
确实包含来自不同文本主体的单字母。我也尝试过俄语,效果也很好。但是,当我尝试使用一些日语文本时,该算法不再按预期工作。
问题源于日语没有空格的事实,因此 TfidfVectorizer 无法理解什么是单词,什么不是。例如,我会在我的单字母词汇表中有这样的东西:
診多索いほ権込真べふり告車クノ般宮えぼぜゆ注携ゆクく供9時ク転組けが意見だっあ税新ト復生ひり教台話辞ゃに
Whic 显然是一个句子而不是一个词。如何解决这个问题?
你应该为日语提供一个标记器
vectorizer = TfidfVectorizer(ngram_range=(1,1), tokenizer=jap_tokenizer)
其中jap_tokenizer
是您创建的函数或类似的函数。
这似乎是documents
的英文版本,基本上是:
documents = ['one word after another', 'two million more words', 'finally almost there']
对于您的日语文档,请称它们为 j_doc1
、j_doc2
和 j_doc3
,documents
可能看起来像这样(只是一个例子;请耐心等待,因为我没有费心创建随机的日语句子):
documents = ['診多索いほ', '診多索いほ', '台話辞ゃに']
当前分词器查找字符串没有的空格。你可以试试这个:
documents = [" ".join(char for char in d) for d in documents]
现在文档看起来像这样,这可能更可行(尽管这取决于您,因为我不知道在每个日语字符之间总是添加一个空格是否合适):
documents
Out[40]: ['診 多 索 い ほ', '診 多 索 い ほ', '台 話 辞 ゃ に']
或者定义你自己的分词器,如另一个答案中所述。