Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Farsi (Persian) Language Support #260

Open
wants to merge 2 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,23 @@ class.
>>> print article.cleaned_text[:150]
دمشق، سوريا (CNN) -- أكدت جهات سورية معارضة أن فصائل مسلحة معارضة لنظام الرئيس بشار الأسد وعلى صلة بـ"الجيش الحر" تمكنت من السيطرة على مستودعات للأسل

Goose in Farsi (Persian)
---------------

In order to use Goose in Farsi you have to use the StopWordsFarsi
class.

::

>>> from goose import Goose
>>> from goose.text import StopWordsFarsi
>>> url = 'http://www.tabnak.ir/fa/news/620497/'
>>> g = Goose({'stopwords_class': StopWordsFarsi})
>>> article = g.extract(url=url)
>>> print article.cleaned_text[:150]
در مراسم تجلیل از مدال آوران المپیک عکس های جالبی به بیرون مخابره شد.
به گزارش تابناک ورزشی، روز گذشته مراسم تجلیل از مدال آوران المپیک توسط علی


Goose in Korean
----------------
Expand Down
14 changes: 14 additions & 0 deletions goose/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
See the License for the specific language governing permissions and
limitations under the License.
"""
import urllib
import urllib2
import urlparse


class HtmlFetcher(object):
Expand All @@ -42,6 +44,18 @@ def get_html(self, url):
if isinstance(url, unicode):
url = url.encode('utf-8')

# for a unicode address the path, query and fragment part
# of url must be quote, otherwise we receive a HTTP 400
# (bad request) response from web server
res = urlparse.urlsplit(url)
url = urlparse.SplitResult(
scheme=res.scheme,
netloc=res.netloc,
path=urllib.quote(res.path),
query=urllib.quote(res.query),
fragment=urllib.quote(res.fragment)
).geturl()

# set request
self.request = urllib2.Request(
url,
Expand Down
218 changes: 218 additions & 0 deletions goose/resources/text/stopwords-fa.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
گیرید
کردی
خواستن
بیاب
بخواهد
آورد
گیریم
کردید
خواستند
بیابد
بخواهم
آوردم
مي‌شود
کردیم
خواسته
بیابم
بخواهند
آوردن
هست
کن
خواستی
بیابند
بخواهی
آوردند
هستم
کند
خواستید
بیابی
بخواهید
آورده
هستند
کنم
خواستیم
بیابید
بخواهیم
آوردی
هستی
کنند
خواهد
بیابیم
بکن
آوردید
هستید
کنی
خواهم
بیاور
بکند
آوردیم
هستیم
کنید
خواهند
بیاورد
بکنم
آورم
یابد
کنیم
خواهی
بیاورم
بکنند
آورند
یابم
گرفت
خواهید
بیاورند
بکنی
آوری
یابند
گرفتم
خواهیم
بیاوری
بکنید
آورید
یابی
گرفتن
داد
بیاورید
بکنیم
آوریم
یابید
گرفتند
دار
بیاوریم
بگو
آید
یابیم
گرفته
دارد
بیاید
بگوید
آیم
یافت
گرفتی
دارم
بیایم
بگویم
آیند
یافتم
گرفتید
دارند
بیایند
بگویند
آیی
یافتن
گرفتیم
داری
بیایی
بگویی
آیید
یافتند
گفت
دارید
بیایید
بگویید
آییم
یافته
گفتم
داریم
بیاییم
بگوییم
باش
یافتی
گفتن
داشت
تواند
بگیر
باشد
یافتید
گفتند
داشتم
توانست
بگیرد
باشد
یافتیم
گفته
داشتن
توانستم
بگیرم
باشم
گفتی
داشتند
توانستن
بگیرند
باشند
گفتید
داشته
توانستند
بگیری
باشی
گفتیم
داشتی
توانسته
بگیرید
باشید
گوید
داشتید
توانستی
بگیریم
باشیم
و
در
به
از
كه
اين
با
می
را
های
براي
ها
آن
وي
يك
خود
بر
ای
نيز
تا
ما
بايد
اند
هم
بود
نمی
هر
یا
دو
آن‌ها
اما
ديگر
اگر
همچنین
است
آیا
او
براى
ندارد
که
می
های
شود
ای
ولی
شده
کرده
کنم
ام
نمی
یا
بودن
کنند
من
شما
بنده
اینکه
بعد
خواهد شد
دادم
23 changes: 23 additions & 0 deletions goose/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,29 @@ def candiate_words(self, stripped_input):
return words


class StopWordsFarsi(StopWords):
"""
Farsi segmentation
"""
def __init__(self, language='fa'):
super(StopWordsFarsi, self).__init__(language='fa')

def remove_punctuation(self, content):
return content

def candiate_words(self, stripped_input):
import hazm
normalizer = hazm.Normalizer()
stemmer = hazm.Stemmer()

words = []
norm_input = normalizer.normalize(stripped_input)
for word in hazm.word_tokenize(norm_input):
words.append(stemmer.stem(word))

return words


class StopWordsKorean(StopWords):
"""
Korean segmentation
Expand Down
2 changes: 1 addition & 1 deletion goose/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ def get_parsing_candidate(self, url_to_crawl):
# replace shebang is urls
final_url = url_to_crawl.replace('#!', '?_escaped_fragment_=') \
if '#!' in url_to_crawl else url_to_crawl
link_hash = '%s.%s' % (hashlib.md5(final_url).hexdigest(), time.time())
link_hash = '%s.%s' % (hashlib.md5(final_url.encode('utf-8')).hexdigest(), time.time())
return ParsingCandidate(final_url, link_hash)


Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ cssselect
jieba
beautifulsoup
nltk
hazm