gpt4 book ai didi

python - 在 Python 中清理属于不同语言的文本

转载 作者:行者123 更新时间:2023-11-28 18:32:44 24 4
gpt4 key购买 nike

我有一个文本集合,其中的句子要么完全是英语,要么是印地语,要么是马拉地语,每个句子都附有 0、1、2 的 id,分别代表文本的语言。

无论任何语言的文本都可能有 HTML 标签、标点符号等。

我可以使用下面的代码清理英文句子:

import HTMLParser
import re
from nltk.corpus import stopwords
from collections import Counter
import pickle
from string import punctuation

#creating html_parser object
html_parser = HTMLParser.HTMLParser()
cachedStopWords = set(stopwords.words("english"))

def cleanText(text,lang_id):

if lang_id == 0:
str1 = ''.join(text).decode('iso-8859-1')


else:
str1 = ''.join(text).encode('utf-8')

str1 = html_parser.unescape(str1)
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, '', str1)
#print "cleantext before puncts removed : " + cleantext
clean_puncts = re.compile(r'[\s{}]+'.format(re.escape(punctuation)))
cleantext = re.sub(clean_puncts,' ',cleantext)
#print " cleantext after puncts removed : " + cleantext
cleanest = cleantext.lower()
if lang_id == 0:
cleanertext = ' '.join([word for word in cleanest.split() if word not in cachedStopWords])
words = re.findall(r"[\w']+", cleanertext)
words_final = [x.encode('UTF8') for x in words]
else:
words_final = cleanest.split()
return words_final

但它为印地语和马拉地语文本提供了以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xeb in position 104: ordinal not in range(128)

此外,它会删除所有单词。

印地语文本就像

&lt;p&gt;भारत का इतिहास काफी समृद्ध एवं विस्तृत है। &lt;/p&gt;

我怎样才能对印地语或马拉地语文本执行相同的操作?

最佳答案

如果没有全文文件,我们所能提供的解决方案只能是瞎猜。

首先,检查您正在读入cleanText() 的字符串类型,它真的是unicode 还是字节串?参见 byte string vs. unicode string. Python

因此,如果您已正确读取文件并确保所有内容都是 unicode,那么管理字符串的方式应该没有问题(在 python2 或 3 中)。以下示例证实了这一点:

>>> from HTMLParser import HTMLParser
>>> hp = HTMLParser()
>>> text = u"&lt;p&gt;भारत का इतिहास काफी समृद्ध एवं विस्तृत है। &lt;/p&gt;"
>>> hp.unescape(text)
u'<p>\u092d\u093e\u0930\u0924 \u0915\u093e \u0907\u0924\u093f\u0939\u093e\u0938 \u0915\u093e\u092b\u0940 \u0938\u092e\u0943\u0926\u094d\u0927 \u090f\u0935\u0902 \u0935\u093f\u0938\u094d\u0924\u0943\u0924 \u0939\u0948\u0964 </p>'
>>> print hp.unescape(text)
<p>भारत का इतिहास काफी समृद्ध एवं विस्तृत है। </p>
>>> hp.unescape(text).split()
[u'<p>\u092d\u093e\u0930\u0924', u'\u0915\u093e', u'\u0907\u0924\u093f\u0939\u093e\u0938', u'\u0915\u093e\u092b\u0940', u'\u0938\u092e\u0943\u0926\u094d\u0927', u'\u090f\u0935\u0902', u'\u0935\u093f\u0938\u094d\u0924\u0943\u0924', u'\u0939\u0948\u0964', u'</p>']
>>> print " ".join(hp.unescape(text).split())
<p>भारत का इतिहास काफी समृद्ध एवं विस्तृत है। </p>

即使使用正则表达式操作,也没有问题:

>>> import re
>>> from string import punctuation
>>> p = re.compile(r'[\s{}]+'.format(re.escape(punctuation)))
>>> new_text = " ".join(hp.unescape(text).split())
>>> re.sub(p,' ', new_text)
u' p \u092d\u093e\u0930\u0924 \u0915\u093e \u0907\u0924\u093f\u0939\u093e\u0938 \u0915\u093e\u092b\u0940 \u0938\u092e\u0943\u0926\u094d\u0927 \u090f\u0935\u0902 \u0935\u093f\u0938\u094d\u0924\u0943\u0924 \u0939\u0948\u0964 p '
>>> print re.sub(p,' ', new_text)
p भारत का इतिहास काफी समृद्ध एवं विस्तृत है। p

看看"How to stop the pain"遵循本次演讲中的最佳实践很可能会解决您的 unicode 问题。幻灯片 http://nedbatchelder.com/text/unipain.html .

也请看看这个:https://www.youtube.com/watch?v=Mx70n1dL534在 PyCon14 上(但仅适用于 python2.x)

像这样打开一个 utf8 文件也可能会解决您的问题:

import io
with io.open('myfile.txt', 'r', encoding='utf8') as fin:
for line in fin:
clean_text(line)

如果 STDIN 和 STDOUT 给您带来问题,请参阅 https://daveagp.wordpress.com/2010/10/26/what-a-character/

另见:

关于python - 在 Python 中清理属于不同语言的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35357604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com