8

我需要用泰语对文本文档进行矢量化(例如 Bag of Words、doc2vec)。

首先,我想检查每个文档,省略除泰语字符和英语单词之外的所有内容(例如,没有标点符号、没有数字、除了撇号之外没有其他特殊字符)。

对于英文文档,我使用这个正则表达式: [^a-zA-Z' ]|^'|'$|''

对于泰语文档,我找不到要使用的正确正则表达式。我知道泰语的 Unicode 块是 u0E00–u0E7F。我尝试[^ก-๛a-zA-Z' ]|^'|'$|''了许多其他组合,但没有成功。

例如:我想要

“ทรูวิชั่นส์ถ่ายทอดศึกฟุตบอลพรีเมียร์ลีกลีกอังกฤษครบทุกเป็นเป็นเป็นเวลาเวลาเวลาเวลาเวลาเวลาเวลาเวลาเวลาเวลาปีตั้งตั้งตั้งตั้งตั้งตั้งตั้งแต่แต่แต่ฤดูกาลฤดูกาลฤดูกาล2016/2017-2018/2018/2019พร้อมพร้อมพร้อมพร้อมพร้อมอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีกอีก งฝรั่งเศสภายใต้คุ้มทั้งผ่านผ่านมือถือและโทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์โทรทัศน์

成为:

“”ทรูวิชั่นส์สดฟุตบอลพรีเมียร์อังกฤษครบนัดเวลาปีตั้งแต่แต่ฤดูกาลพร้อมพร้อมด้วยด้วยอีกอีกอีกอีกลีกลาลาลีกาลีกาลีกาลีกาลีกาลีกาลาลาลาลาลาลาลาลาลา ทั้งผ่านมือถือ และโทรทัศน์一些英文单词abc"

4

4 回答 4

9

我将使用一些列表来做我需要的事情。

首先,让我们创建模式:

pattern = re.compile(r"[^\u0E00-\u0E7Fa-zA-Z' ]|^'|'$|''")

我将使用一个名为的字符串test_string,其中包含您的示例:

test_string="ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"

首先,让我们在列表中获取要删除的字符:

char_to_remove = re.findall(pattern, test_string)

然后,让我们创建一个由原始字符串中的字符组成的列表,不包含这些字符:

list_with_char_removed = [char for char in test_string if not char in char_to_remove]

我们将这个列表转换成一个字符串,我们就完成了。

result_string = ''.join(list_with_char_removed)

结果是:

'ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา ปี ตั้งแต่ฤดูกาล พร้อมด้วยอีก ลีกดัง อาทิ ลา ลีกา สเปน กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some English words here abc'

如果您有任何更清洁的方法来执行任何步骤/任何问题,请不要犹豫!

于 2016-07-27T15:31:20.710 回答
2

在 Python 3 中,

s = "ทรูวิชั่นส์ ประกาศถ่ายทอดสดศึกฟุตบอล พรีเมียร์ ลีก อังกฤษ ครบทุกนัดเป็นเวลา 3 ปี ตั้งแต่ฤดูกาล 2016/2017 - 2018/2019 พร้อมด้วยอีก 5 ลีกดัง อาทิ ลา ลีกา สเปน, กัลโช เซเรีย เอ อิตาลี และลีกเอิง ฝรั่งเศส ภายใต้แพ็กเกจสุดคุ้ม ทั้งผ่านมือถือ และโทรทัศน์ some, English words here! abc123"
pattern = re.compile(r"(?:[^\d\W]+)|\s")
for each in pattern.findall(s): print(each, end="")

输出这个:

ทรวชนส ประกาศถายทอดสดศกฟตบอล พรเมยร ลก องกฤษ ครบทกนดเปนเวลา  ป ตงแตฤดกาล    พรอมดวยอก  ลกดง อาท ลา ลกา สเปน กลโช เซเรย เอ อตาล และลกเอง ฝรงเศส ภายใตแพกเกจสดคม ทงผานมอถอ และโทรทศน some English words here

口音正在被删除,所以这不是一个完美的答案。我目前正在环顾四周,看看为什么会发生这种情况。

编辑:使用 HolyDanna 回答中的字符范围,您可以保留口音。有趣的是,仅使用 word 不会保留重音(这可能是由于 unicode 代码点如何在重音字符之后添加重音作为另一个代码点,但似乎是一个错误)。它还具有从其他语言中删除字符的副作用。只需替换编译行 HolyDanna 的:

pattern = re.compile(r"[\u0E00-\u0E7Fa-zA-Z' ]")

如果你不想要它,你可以去掉撇号(等)。

于 2016-07-27T14:46:02.673 回答
1

遗憾的是,支持良好 Unicode 的正则表达式库并不多,Python 的re库就是其中之一。Oniguruma 具有适当的 Unicode 支持,我相信它具有 Python 绑定,并且 Perl 的内置正则表达式具有良好的 Unicode 支持。

我通常不建议人们切换语言,但在这种情况下,使用 Perl 会省去很多麻烦(并且作为记录,我拥有 Python 金牌,并且在过去十年中没有接触过 Perl! )。以下是它的简单性(在 Oniguruma 中应该是相同的,我认为它具有 Python 绑定):

[^\p{Latin}\p{Thai}]+

这是 Perl 示例代码:

#!/usr/bin/perl -w
use utf8;
$_ = "ทรูวิชั่นส์ ประ...abc123";
s/[^\p{Latin}\p{Thai}]+/ /g;
print;
print "\n";

这是输出:

ทรูวิชั่นส์ประกาศศึกพรีเมียร์ลีกอังกฤษครบทุกเป็นเวลาปีแต่พร้อมพร้อมพร้อมด้วยด้วยอีกอีกอีกลีกลีกดังอาทิลาลีกาลีกาสเปนกัลโชกัลโชกัลโชเซเรียเอเออิตาลีอิตาลี มือถือ และโทรทัศน์ 这里有一些英文单词 abc

于 2016-07-27T15:35:29.760 回答
1

在 Java 中,您可以匹配 Thai en English 的组合: ^[\\p{L}\\p{javaUnicodeIdentifierPart}\\p{Blank}\\p{P}]*$

分解:

  • \\p{L}是一个“正常”的字母
  • \\p{javaUnicodeIdentifierPart}匹配一个泰文字母
  • \\p{Blank}匹配空格字符
  • \\p{P}匹配标点符号。

我不是泰语专家(除了我认识它),但没有标点符号匹配字符串不匹配。

于 2021-10-17T04:23:51.123 回答