如何用Hazm标准化波斯文本

时间:2016-12-15 22:44:56

标签: python-3.x nlp persian

我有一个包含其他文件夹的文件夹,每个文件夹都包含很多文本文件。我必须在特定单词之前和之后提取 5个单词,并且以下代码可以正常工作。

问题在于,因为我没有对文本进行规范化,所以只返回几个句子,而有更多。 在波斯语中,有一个名为 hazm 的模块用于规范化文本。我如何在此代码中使用它?

例如正常化:“ك”应更改为“ک”“ؤ”应更改为“و”。因为前两个实际上是在波斯语中使用的阿拉伯语字母。如果没有规范化代码,则只返回使用第二种形式编写的单词,而不识别第一种形式的单词 Arabic )。

import os
from hazm import Normalizer


def getRollingWindow(seq, w):
    win = [next(seq) for _ in range(11)]
    yield win
    for e in seq:
        win[:-1] = win[1:]
        win[-1] = e
        yield win


def extractSentences(rootDir, searchWord):
    with open("پاکت", "w", encoding="utf-8") as outfile:
        for root, _dirs, fnames in os.walk(rootDir):
            for fname in fnames:
                print("Looking in", os.path.join(root, fname))
                with open(os.path.join(root, fname), encoding = "utf-8") as infile:
                    #normalizer = Normalizer()
                    #fname = normalizer.normalize(fname)
                    for window in getRollingWindow((word for line in infile for word in line(normalizer.normalize(line)).split()), 11):
                        if window[5] != searchWord: continue
                        outfile.write(' '.join(window)+ "\n")

1 个答案:

答案 0 :(得分:0)

我不使用 Hazm 但是使用下面的代码将其自我标准化相当容易。 (代码只用波斯语字符替换阿拉伯字符)

def clean_sentence(sentence):
    sentence = arToPersianChar(sentence)
    sentence = arToPersianNumb(sentence)
    return sentence


def arToPersianNumb(number):
    dic = {
        '١': '۱',
        '٢': '۲',
        '٣': '۳',
        '٤': '۴',
        '٥': '۵',
        '٦': '۶',
        '٧': '۷',
        '٨': '۸',
        '٩': '۹',
        '٠': '۰',
    }
    return multiple_replace(dic, number)


def arToPersianChar(userInput):
dic = {
    'ك': 'ک',
    'دِ': 'د',
    'بِ': 'ب',
    'زِ': 'ز',
    'ذِ': 'ذ',
    'شِ': 'ش',
    'سِ': 'س',
    'ى': 'ی',
    'ي': 'ی'
}
return multiple_replace(dic, userInput)


def multiple_replace(dic, text):
    pattern = "|".join(map(re.escape, dic.keys()))
    return re.sub(pattern, lambda m: dic[m.group()], str(text))

您需要阅读文档的每一行并将其传递给clean_sentence()

def clean_all(document):
    clean = ''
    for sentence in document:
        sentence = clean_sentence(sentence)
        clean += ' \n' + sentence
    return clean