Ошибка использования langdetect в python: "Нет текста в тексте"
Эй, у меня есть CSV с многоязычным текстом. Все, что я хочу, - это колонка с добавленным языком. Итак, я закодировал, как показано ниже,
from langdetect import detect
import csv
with open('C:\\Users\\dell\\Downloads\\stdlang.csv') as csvinput:
with open('C:\\Users\\dell\\Downloads\\stdlang.csv') as csvoutput:
writer = csv.writer(csvoutput, lineterminator='\n')
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append('Lang')
all.append(row)
for row in reader:
row.append(detect(row[0]))
all.append(row)
writer.writerows(all)
Но я получаю ошибку как LangDetectException: No features in text
Трассировка выглядит следующим образом
runfile('C:/Users/dell/.spyder2-py3/temp.py', wdir='C:/Users/dell/.spyder2-py3')
Traceback (most recent call last):
File "<ipython-input-25-5f98f4f8be50>", line 1, in <module>
runfile('C:/Users/dell/.spyder2-py3/temp.py', wdir='C:/Users/dell/.spyder2-py3')
File "C:\Users\dell\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile
execfile(filename, namespace)
File "C:\Users\dell\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 89, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/dell/.spyder2-py3/temp.py", line 21, in <module>
row.append(detect(row[0]))
File "C:\Users\dell\Anaconda3\lib\site-packages\langdetect\detector_factory.py", line 130, in detect
return detector.detect()
File "C:\Users\dell\Anaconda3\lib\site-packages\langdetect\detector.py", line 136, in detect
probabilities = self.get_probabilities()
File "C:\Users\dell\Anaconda3\lib\site-packages\langdetect\detector.py", line 143, in get_probabilities
self._detect_block()
File "C:\Users\dell\Anaconda3\lib\site-packages\langdetect\detector.py", line 150, in _detect_block
raise LangDetectException(ErrorCode.CantDetectError, 'No features in text.')
LangDetectException: нет элементов в тексте.
Вот так выглядит мой csv: 1) самый неуклюжий, самый дымный, самый вкусный, болеутоляющий и поднимающий настроение. 2) Релаксация, эйфория, сурелье, сонливость, сосредоточенность, пикантность, увеличение аппетита, душевное равновесие, физическое состояние, эсприт-сессия 3)Reduzierte Angst, Ruhe, gehobener Stimmung, Zerebrale Energie, Körper Sedierung 4)Calmante, реладжантные мускулистые, Relajación Mental, диссуминация в стихах 5)重い 強力 バ 非常 非常 非常非常
Пожалуйста, помогите мне с этим.
5 ответов
Вы можете использовать что-то вроде этого, чтобы определить, какая строка в вашем файле выдает ошибку:
for row in reader:
try:
language = detect(row[0])
except:
language = "error"
print("This row throws and error:", row[0])
row.append(language)
all.append(row)
То, что вы увидите, это то, что он, вероятно, потерпит неудачу в "重いフルー ー ィー ー 幸せ非常に強力な な な ト ト ト ト". Я думаю, что detect()
не может "идентифицировать" какие-либо символы для анализа в этой строке, что и подразумевает ошибка.
Другие вещи, например, когда вход является только URL, также вызывают эту ошибку.
Ошибка произошла при передаче объекта без букв вdetect
. Там должна быть хотя бы одна буква.
Для воспроизведения выполните любую из следующих команд:
detect('.')
detect(' ')
detect('5')
detect('/')
Итак, вы можете сначала применить некоторую предварительную обработку текста, чтобы удалить записи, в которых row[0]
value - это пустая строка, нулевое значение, пробел, число, специальный символ или просто не включает никаких алфавитов.
Проблема в пустом тексте или что-то вроде ' ' без значения; проверить это в условии и зациклить читателя в понимании списка или
from langdetect import detect
textlang = [detect(elem) for elem in textlist if len(elem) > 50]
textlang = [detect(elem) if len(elem) > 50 else elem == 'no' for elem in textlist]
или с петлей
texl70 = df5['Titletext']
langdet = []
for i in range(len(df5)):
try:
lang=detect(texl70[i])
except:
lang='no'
print("This row throws error:", texl70[i])
langdet.append(lang)
Ошибка возникает, когда в строке нет букв. Если вы хотите игнорировать эту строку и продолжить процесс.
for i in df.index:
str = df.iloc[i][1]
try:
lang = detect(str)
except:
continue
Перехватывать все возможные исключения — плохая практика. Позвольте мне предложить что-то более полное, более читабельное и безопасное:
rx_letters = re.compile("[a-z]+", re.I)
for row in reader:
try:
if rx_letters.search(row[0]) is not None:
row.append(detect(row[0]))
except LangDetectException as e:
row.append("?")
print(f"Lang detect failed for: '{row[0]}'")
rx_letters
проверку можно пропустить, но я считаю более элегантным проверить самое основное условие.