создать облако слов на питоне для иностранного языка (иврит)

Я хочу создать облако слов. Когда моя строка на английском языке, все работает нормально:

from wordcloud import WordCloud
from matplotlib import pyplot as plt
text="""Softrock 40 - close to the 6 MHz that the P6D requires (6.062 according) - https://groups.yahoo.com/neo/groups/softrock40/conversations/messages
I want the USB model that has a controllable (not fixed) central frequency."""
wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

введите описание изображения здесь

Но когда я делаю то же самое на иврите, он не определяет шрифт, и я получаю только пустые прямоугольники:

text="""תחילתו של חורף מאכזב למדיי, מומחי המים בישראל מאמינים כי לראשונה השנה מפלס הכנרת יעלה בצורה משמעותית מגשמי הסערה שתחל היום"""
wordcloud = WordCloud().generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

введите описание изображения здесь

Любые идеи?


person Binyamin Even    schedule 06.01.2019    source источник
comment
Похоже, он использует шрифт, который просто не поддерживает символы.   -  person Willem Van Onsem    schedule 06.01.2019
comment
Что, если вы создадите wordcloud = WordCloud(font_path='/font/to/some_font').generate(text) с some_font шрифтом, поддерживающим символы иврита.   -  person Willem Van Onsem    schedule 06.01.2019
comment
откуда мне скачать шрифт?   -  person Binyamin Even    schedule 06.01.2019
comment
хорошо, ваша система обычно уже имеет некоторые шрифты, в зависимости от операционной системы, они расположены где-то еще. Например, в Linux он часто находится под /usr/share/fonts.   -  person Willem Van Onsem    schedule 06.01.2019
comment
Благодарю вас! пожалуйста, добавьте это как ответ, и я с радостью приму его.   -  person Binyamin Even    schedule 06.01.2019


Ответы (1)


Это связано не столько с самим облаком слов, сколько с рендерингом: вы используете (ну, по умолчанию) шрифт, который просто не содержит никаких «определений» для символов иврита. Таким образом, вместо этого он просто отображает прямоугольники.

Однако мы можем использовать шрифт, который поддерживает символы иврита, например FreeSansBold. Мы можем передать путь к шрифту через конструктор WordCloud:

from wordcloud import WordCloud
from matplotlib import pyplot as plt

text="""תחילתו של חורף מאכזב למדיי, מומחי המים בישראל מאמינים כי לראשונה השנה מפלס הכנרת יעלה בצורה משמעותית מגשמי הסערה שתחל היום"""
wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/freefont/FreeSansBold.ttf').generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

то это генерирует следующее облако слов:

облако слов сгенерировано другим шрифтом

Я не очень хорошо знаком с ивритом, но мне кажется, что слова пишутся слева направо, а не справа налево. В любом случае, если это проблема, мы можем использовать python-bidi для сначала обработайте направление языка, например:

from wordcloud import WordCloud
from matplotlib import pyplot as plt
from bidi.algorithm import get_display

text="""תחילתו של חורף מאכזב למדיי, מומחי המים בישראל מאמינים כי לראשונה השנה מפלס הכנרת יעלה בצורה משמעותית מגשמי הסערה שתחל היום"""

bidi_text = get_display(text)

wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/freefont/FreeSansBold.ttf').generate(bidi_text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

Тогда для заданного текста мы получим следующее изображение:

облако слов с написанием справа налево на иврите

person Willem Van Onsem    schedule 06.01.2019