我正在处理用多种语言编写的大量文档。我想从他们的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
确实包含来自不同文本正文的unigrams 。我也尝试过俄语,它也很棒。但是,当我尝试使用一些日文文本时,该算法不再按预期工作。
问题源于日语没有空格,因此TfidfVectorizer不理解什么是单词,什么不是。例如,我的unigram词汇表中会有类似的东西:
诊多索いほ権込真べふり告车クノ般宫えぼぜゆ注携ゆクく供9时ク転组けが意见だっあ税新ト复生ひり教台话辞ゃに
Whic显然是一句话,而不是一句话。我该如何解决这个问题?
答案 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_doc1
,j_doc2
和j_doc3
,documents
可能看起来像这样(只是一个例子;请耐心等待,因为我没有'打扰随意的日语句子):
documents = ['診多索いほ', '診多索いほ', '台話辞ゃに']
当前的标记生成器会查找字符串所没有的空格。你可以试试这个:
documents = [" ".join(char for char in d) for d in documents]
现在文档看起来像这样,这可能更可行(虽然这取决于你,因为我不知道在每个日文字符之间总是添加空格是否合适):</ p>
documents
Out[40]: ['診 多 索 い ほ', '診 多 索 い ほ', '台 話 辞 ゃ に']
或定义您自己的标记器,如另一个答案中所述。