Извлечение всего текста перед первой вкладкой из списка строк

#python #string #list #split

#python #строка #Список #разделение

Вопрос:

Итак, у меня есть этот text_data из http://www.manythings.org/anki / это выглядит примерно так

 ['Hi.tHallo!tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) amp; #380701 (cburgmer)n',
 'Hi.tGrüß Gott!tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) amp; #659813 (Esperantostern)n',
 'Run!tLauf!tCC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) amp; #941078 (Fingerhut)n',
 'Wow!tPotzdonner!tCC-BY 2.0 (France) Attribution: tatoeba.org #52027 (Zifre) amp; #2122382 (Pfirsichbaeumchen)n',
 'Wow!tDonnerwetter!tCC-BY 2.0 (France) Attribution: tatoeba.org #52027 (Zifre) amp; #2122391 (Pfirsichbaeumchen)n',
 'Fire!tFeuer!tCC-BY 2.0 (France) Attribution: tatoeba.org #1829639 (Spamster) amp; #1958697 (Tamy)n',
 'Help!tHilfe!tCC-BY 2.0 (France) Attribution: tatoeba.org #435084 (lukaszpp) amp; #575889 (MUIRIEL)n',
...
]
  

Я сделал это

 English = []
for sent in data_examples:
    pattern  = re.compile(r'. ?t')
    matches = pattern.finditer(sent)
    for match in matches:
        English.append(match)
  

как захватить английский в текстах? Мой на самом деле не работает.

Комментарии:

1. Во-первых, вы можете переместить pattern=... внешнюю часть цикла, поскольку она не меняется.

2. мой на самом деле не работает — это не подробное описание проблемы… Почему вы используете finditer , если вам нужно только первое слово? Почему бы и нет pattern.match(sent) ?

3. В вашем примере нет английского языка.

4. Кстати, почему Tatoeba? Как вы думаете, вы можете доверять этим корпусам? Похоже, что они сделаны пользователем, без надлежащего обеспечения качества локализации.

5. Спасибо всем за комментарии. Я довольно новичок, я проверял на YouTube, и люди используют finditer, я думаю, Tomerikoo делает хороший вывод, используя match. И я работаю над этим для обучения, качество для меня не главное

Ответ №1:

Ваши английские сегменты расположены в первом столбце.

Все, что вам нужно сделать, это

 English = [sent.split('t')[0] for sent in data_examples]
  

Ответ №2:

Решение:
Это может решить вашу задачу

 import nltk
words = None
try:
    words = set(nltk.corpus.words.words())
except:
    nltk.download('words')
    words = set(nltk.corpus.words.words())

# Extra words which are not present in nltk words corpus
words_need_to_include = ['france']

for w in words_need_to_include:
    words.add(w)

# Words which we don't want in nltk words corpus
words_need_to_exclude = ['by']

for w in words_need_to_exclude:
    words.remove(w)

# Input data
in_text = ['Hi.tHallo!tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) amp; #380701 (cburgmer)n france',
 'Hi.tGrüß Gott!tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) amp; #659813 (Esperantostern)n',
 'Run!tLauf!tCC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) amp; #941078 (Fingerhut)n',
 'Wow!tPotzdonner!tCC-BY 2.0 (France) Attribution: tatoeba.org #52027 (Zifre) amp; #2122382 (Pfirsichbaeumchen)n',
 'Wow!tDonnerwetter!tCC-BY 2.0 (France) Attribution: tatoeba.org #52027 (Zifre) amp; #2122391 (Pfirsichbaeumchen)n',
 'Fire!tFeuer!tCC-BY 2.0 (France) Attribution: tatoeba.org #1829639 (Spamster) amp; #1958697 (Tamy)n',
 'Help!tHilfe!tCC-BY 2.0 (France) Attribution: tatoeba.org #435084 (lukaszpp) amp; #575889 (MUIRIEL)n',
]

# Code
English = []
for x in in_text:
    English.append(" ".join(w for w in nltk.wordpunct_tokenize(x) if w.lower() in words))
    #print(" ".join(nltk.wordpunct_tokenize(x)))

print(English)
  

ВЫВОД:

 ['Hi France Attribution france', 'Hi France Attribution', 'Run France Attribution', 'Wow France Attribution', 'Wow France Attribution', 'Fire France Attribution', 'Help France Attribution']
  

Комментарии:

1. Также добавлена переменная для исключения слов из строки, которые не являются обязательными, но являются частью английского языка