如何使用 Hazm 规范化波斯语文本
How to normalize Persian texts with Hazm
我有一个包含其他一些 文件夹 的文件夹,每个文件夹都包含很多文本文件。我必须在特定单词前后提取 5 个单词,下面的代码工作正常。
问题是因为我没有规范化文本,所以只有returns几个句子,而还有更多。
在波斯语中,有一个名为 hazm 的模块用于规范化文本。我如何在此代码中使用它?
规范化示例:"ك" 应更改为 "ک" 或 "È" 应更改为“و”。因为前两个实际上是 阿拉伯语 字母表,用于 波斯语。如果不对代码进行规范化,则仅 returns 以第二种形式书写的单词,它无法识别第一种形式的单词 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")
我没有使用 Hazm 的经验,但是使用以下代码很容易自己对其进行归一化。
(注意这里我们只是将阿拉伯字符替换为波斯字符)
def clean_sentence(sentence):
sentence = arToPersianChar(sentence)
sentence = arToPersianNumb(sentence)
# more_normalization_function()
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
我有一个包含其他一些 文件夹 的文件夹,每个文件夹都包含很多文本文件。我必须在特定单词前后提取 5 个单词,下面的代码工作正常。
问题是因为我没有规范化文本,所以只有returns几个句子,而还有更多。 在波斯语中,有一个名为 hazm 的模块用于规范化文本。我如何在此代码中使用它?
规范化示例:"ك" 应更改为 "ک" 或 "È" 应更改为“و”。因为前两个实际上是 阿拉伯语 字母表,用于 波斯语。如果不对代码进行规范化,则仅 returns 以第二种形式书写的单词,它无法识别第一种形式的单词 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")
我没有使用 Hazm 的经验,但是使用以下代码很容易自己对其进行归一化。 (注意这里我们只是将阿拉伯字符替换为波斯字符)
def clean_sentence(sentence):
sentence = arToPersianChar(sentence)
sentence = arToPersianNumb(sentence)
# more_normalization_function()
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