Как искать предложения, содержащие отдельные символы, используя Python и Pandas - PullRequest
4 голосов
/ 06 февраля 2020

Я пытаюсь распечатать предложения из кадра данных, который содержит слова с одним символом, независимо от того, где он находится в начале или в середине предложения, проблема в том, что мой код отлично работает для сценария Engli sh, но когда Я изменяю надписи, скажем, на арабский c, он печатает неправильный вывод всех предложений вместо желаемого вывода, в котором есть одна буква.


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 

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

Почему этот код не работает для сценария Arabi c, аналогичного Engli sh one?

Я также попробовал другой метод, который не работал

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

Не можем ли мы создать массив букв, которые мы хотим, как (ذ ب ا م ك خ ح), и когда они встречаются в предложении в одиночку, это предложение не будет намного лучше и меньше головной боли?

1 Ответ

3 голосов
/ 07 февраля 2020

Попробуйте этот код:

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    باب المدرسة ب مفتوح

Regex Объяснение :

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

[\u0600-\u06ff] охватывает стандартный диапазон Юникода Arabi c включая буквы, цифры и диакритические знаки. Используя отрицательный lookbehind (?<![\u0600-\u06ff]) и отрицательный lookahead (?![\u0600-\u06ff]), мы ограничиваем совпадение любым единичным арабским c символом, который не предшествует и не сопровождается другим арабским c символом.

В случае, если вы хотите сопоставить указанное значение c набор символов и не все из них, замените средний [\u0600-\u06ff] на любой набор, который вы хотите. Например, если вы хотите сопоставить только арабские c цифры от нуля до девяти, вместо этого используйте [\u0660-\u0669]:

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

Для engli sh весь шаблон должен выглядеть следующим образом:

pattern = '\b\w\b'
...