在 Python 中标记非英文文本 [英] Tokenizing non English Text in Python

查看:26
本文介绍了在 Python 中标记非英文文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个波斯文本文件,里面有一些像这样的行:

 ذوب 6 خوی 7 بزاق ،آب‌دهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف

我想从这一行生成一个单词列表.对我来说,单词边框是数字,如上一行中的 6、7 等,还有 ، 字符.所以列表应该是:

[ 'ذوب','خوی','بزاق','آب‌دهان','یم','زهاب','آبرو','حیثیت','شرف']

我想在 Python 3.3 中做到这一点.这样做的最佳方法是什么,我非常感谢您对此提供的帮助.

我得到了很多答案,但是当我将它们用于另一个测试用例时,它们不起作用.测试用例是这样的:

منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن

我希望有一个这样的令牌列表:

['منهدم کردن', 'خراب کردن', 'ویران کردن', 'تخریب کردن', 'نابود کردن', 'از بدین] بن

解决方案

使用 regex:

<预><代码>>>>导入正则表达式>>>text = 'ذوب 6 خوی 7 بزاق ،آب‌دهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف'>>>regex.findall(r'\p{L}+', text.replace('\u200c', ''))['ذوب', 'خوی', 'بزاق', 'آبدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

  • 文本包含零宽度非连接器 (U+200C).使用 str.replace 删除字符.
  • \p{L}\p{Letter} 匹配来自任何语言的任何类型的字母.

请参阅正则表达式教程 - Unicode 字符和属性.

更新

要同时包含 U+200C,请使用 [\p{Cf}\p{L}]+ 代替(\p{Cf}\p{Format} 匹配不可见的格式化字符):

<预><代码>>>>regex.findall(r'[\p{Cf}\p{L}]+', 文本)['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

它看起来与您想要的不同,但它们是相同的:

<预><代码>>>>got = regex.findall(r'[\p{Cf}\p{L}]+', 文本)>>>想要 = [ 'ذوب','خوی','بزاق','آب‌دهان','یم','زهاب','آبرو','حیثیت','شرف']>>>打印(想要)['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']>>>得到 == 想要>>>得到[:3]['ذوب', 'خوی', 'بزاق']>>>得到[4:]['یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

更新2

编辑过的问题中的某些单词包含空格.

<预><代码>>>>' ' in 'منهدم کردن'真的

我在下面的代码中添加了 \s 以匹配空格,然后从匹配的字符串中去除前导和尾随空格,然后过滤掉空字符串.

<预><代码>>>>文本 = 'منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن'>>>想要 = ['منهدم کردن','خراب کردن', 'ویران کردن', 'تخریب کردن','نابود کردن', 'از بین بردن']>>>[x for x in map(str.strip, regex.findall(r'[\p{Cf}\p{L}\s]+', text)) if x] == want真的

I have a Persian text file that has some lines like this:

 ذوب 6 خوی 7 بزاق ،آب‌دهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف

I want to generate a list of words from this line. For me the word borders are numbers, like 6, 7, etc in the above line and also ، character. so the list should be:

[ 'ذوب','خوی','بزاق','آب‌دهان','یم','زهاب','آبرو','حیثیت' ,'شرف'] 

I want to do this in Python 3.3. What is the best way of doing this, I really appreciate any help on this.

EDIT:

I got a number of answers but when I used them for another test case they didn't work. The test case is this:

منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن 

and I expect to have a list of tokens as this:

['منهدم کردن','خراب کردن', 'ویران کردن', 'تخریب کردن','نابود کردن', 'از بین بردن']  

解决方案

Using regex package:

>>> import regex
>>> text = 'ذوب 6 خوی 7 بزاق ،آب‌دهان ، یم 10 زهاب، 11 آبرو، حیثیت، شرف'
>>> regex.findall(r'\p{L}+', text.replace('\u200c', ''))
['ذوب', 'خوی', 'بزاق', 'آبدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

  • The text contains ZERO WIDTH NON-JOINER (U+200C). removed the character using str.replace.
  • \p{L} or \p{Letter} matches any kind of letter from any language.

See Regex Tutorial - Unicode Characters and Properties.

UPDATE

To also include U+200C, use [\p{Cf}\p{L}]+ instead (\p{Cf} or \p{Format} matches invisible formatting character):

>>> regex.findall(r'[\p{Cf}\p{L}]+', text)
['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

It looks diffent from what you want, but they are equal:

>>> got = regex.findall(r'[\p{Cf}\p{L}]+', text)
>>> want = [ 'ذوب','خوی','بزاق','آب‌دهان','یم','زهاب','آبرو','حیثیت' ,'شرف']
>>> print(want)
['ذوب', 'خوی', 'بزاق', 'آب\u200cدهان', 'یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']
>>> got == want
>>> got[:3]
['ذوب', 'خوی', 'بزاق']
>>> got[4:]
['یم', 'زهاب', 'آبرو', 'حیثیت', 'شرف']

UPDATE2

Some words in the edited question contains a space.

>>> ' ' in 'منهدم کردن'
True

I added \s in the following code to also match the spaces, then strip the leading, trailing spaces from the matched strings, then filtered out empty strings.

>>> text = 'منهدم کردن : 1 خراب کردن، ویران کردن، تخریب کردن 2 نابود کردن، از بین بردن'
>>> want = ['منهدم کردن','خراب کردن', 'ویران کردن', 'تخریب کردن','نابود کردن', 'از بین بردن']
>>> [x for x  in map(str.strip, regex.findall(r'[\p{Cf}\p{L}\s]+', text)) if x] == want
True

这篇关于在 Python 中标记非英文文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆