如何使用Python和Pandas查找具有单个字符的句子

问题描述 投票:4回答:1

我试图从包含一个字符的单词的数据帧中打印出句子,而不管它在句子中间或结尾处的位置如何,挑战是我的代码非常适合英语脚本,但是当我更改脚本时对阿拉伯语说,它会在所有句子中输出错误的输出,而不是在其中包含一个字母的所需输出。


tdata = pd.read_csv(fileinput, nrows=0).columns[0]
skip = int(tdata.count(' ') == 0)
tdata = pd.read_csv(fileinput, names=['sentences'], skiprows=skip)
df = tdata[dftdata'sentences'].str.contains(r'\b\w{1}\b')]
print(df)


a sample set
-----------------------------

#هلو كيفك م هي اخباركم
#ج ليش اتاخرت اليوم
#هو كلش نذل
#ترا اني كلش حباب ذ
#باب المدرسة ب مفتوح
#الحمدالله الكل بخير
#كم نَحنُ كبار  مع هذا نعتمد على والدنا في مصروفنا
#كم نَحنُ كبار  مع هذا لا تعرف كيفَ نتحدث بطريقة لائقة في المجلس
#كم نَحنُ كبار  مع هذا لا نعرف كيفَ نعبر الشارِع بمفردنا
#هل اهتممتم بوالدتكم  انها مسكينة قد لاحظت انها متعبة جداً ً
#كفاكُن كلام اذهبن  ادرسن َ  اجتهدن
#لِمَ لا تجففن مستحضر (طين البحر الميت ) قبل أن تستخدمنه ُ  
#  ادرسن َ  
# أعشقك ِ
#هل   ً
-----------------------------

expected output 

-----------------------------
#هلو كيفك م هي اخباركم
#ج ليش اتاخرت اليوم
#ترا اني كلش حباب ذ
#باب المدرسة ب مفتوح
-----------------------------

为什么此代码不适用于与英语相同的阿拉伯语脚本?

我也尝试了另一种无效的方法

tdata.loc[tdaTa.sentences.str.contains(r"([^\w]|^)\w([^\w]|$)")]

不能创建一个我们想要的字母数组,当它们单独出现在句子中时,该句子会不会是更好的方式,并且会减少头痛?

python regex pandas dataframe arabic
1个回答
3
投票

尝试此代码:

import pandas as pd

# mocking the dataframe based on your sample data
df = pd.DataFrame({'sentences': [
    'هلو كيفك م هي اخباركم',
    'ج ليش اتاخرت اليوم',
    'هو كلش نذل',
    'ترا اني كلش حباب ذ',
    'باب المدرسة ب مفتوح',
    'الحمدالله الكل بخير',
    'كم نَحنُ كبار  مع هذا نعتمد على والدنا في مصروفنا',
    'كم نَحنُ كبار  مع هذا لا تعرف كيفَ نتحدث بطريقة لائقة في المجلس',
    'كم نَحنُ كبار  مع هذا لا نعرف كيفَ نعبر الشارِع بمفردنا',
    'لِمَ لا تجففن مستحضر (طين البحر الميت ) قبل أن تستخدمنه'
]})

# selecting sentences with a single Arabic character word using regex
pattern = '(?<![\u0600-\u06ff])[\u0600-\u06ff](?![\u0600-\u06ff])'
df = df[df['sentences'].str.contains(pattern)]

print(df)
#                sentences
# 0  هلو كيفك م هي اخباركم
# 1     ج ليش اتاخرت اليوم
# 3     ترا اني كلش حباب ذ
# 4    باب المدرسة ب مفتوح

正则表达式说明

pattern = '(?<![\u0600-\u06ff])[\u0600-\u06ff](?![\u0600-\u06ff])'

[\u0600-\u06ff]涵盖了标准的阿拉伯语unicode range,包括字母,数字和变音符号。通过使用负向后看(?<![\u0600-\u06ff])和负向前看(?![\u0600-\u06ff]),我们可以将匹配限制为任何一个阿拉伯字符,该字符既不位于另一个阿拉伯字符的前面也不位于另一个阿拉伯字符的后面。

如果要匹配特定的字符集而不是全部字符,请将中间的[\u0600-\u06ff]更改为所需的任何字符集。例如,如果您只想匹配从零到九的阿拉伯数字,则使用[\u0660-\u0669]代替:

pattern = '(?<![\u0600-\u06ff])[\u0660-\u0669](?![\u0600-\u06ff])'

对于英语,整个模式应类似于:

pattern = '\b\w\b'
© www.soinside.com 2019 - 2024. All rights reserved.