Почему случается ошибка "No features in text" langdetect?
Цель программы отделить русский перевод слов от немецкого значения и поместить это в разные списки. Файл, в котором находится всё это выглядит примерно вот так:
das Sedimentgestein осадочная порода
Kernspaltung расщепление атомного ядра
Im Grunde genommen по сути
...
то есть в одной строчке находится сначала значение, а потом перевод. В целом программа делает то, что мне нужно - разносит значение и перевод по разным спискам в правильной последовательности.
Изначальный код вышел очень медленным, поэтому пытаюсь ускорить его за счет lru_cache, но что-то идёт не так и скорее всего я неправильно использую lru_cache. В итоге вылезает ошибка:
Traceback (most recent call last): File "C:\Users\write\OneDrive\Документы\help\hell1.py", line 28, in word2=str(detect_cached(word)) File "C:\Users\write\OneDrive\Документы\help\hell1.py", line 23, in detect_cached return detect(t) File "C:\Users\write\AppData\Local\Programs\Python\Python38\lib\site-packages\langdetect\detector_factory.py", line 130, in detect return detector.detect() ... raise LangDetectException(ErrorCode.CantDetectError, 'No features in text.') langdetect.lang_detect_exception.LangDetectException: No features in text.
Код:
import os
import langdetect
from functools import lru_cache
os.chdir(r'C:\Users\write\OneDrive\Документы\help')
file=open('wordd.txt', 'r')
from langdetect import detect
deut=[]
rus=[]
deut2=[]
rus2=[]
k=0
@lru_cache(None)
def detect_cached(t):
return detect(t)
for line in file.readlines():
d=line.split(' ')
for word in d:
word2=detect_cached(word)
try:
if (detect(word2)!='uk' and
detect(word2)!='ru' and
detect(word2)!='mk' and
detect(word2)!='bg') :
deut.append(word) #здесь хранится немецкое словосочетание или слово
else:
rus.append(word) #русское словосочетание или слово
except:
pass
MyString=' '.join(deut)
deut2.append(MyString)
rus2.append(rus)
deut=[]
rus=[]
k+=1
print(' ')
rus2=[x for x in rus2 if x!=''] #удаление пустых элементов в русском списке, в немецком все ок
import random
a=random.choice(rus2)
for i in a:
print(i)
Ответы (2 шт):
В issues библиотеки langdetect, автор ответил про смысл этой ошибки:
Error No features in text generally means, that there is no way to detect a language on the given input.
For example, when you pass in string (or a number): 222222, what language is it? Can't tell, right? Similarly, when you pass just url: https://www.mark.cn or whatever.
To throw an exception at that point is the best way to handle such inputs. What you want to do is to catch the exception and handle the situation accordingly.
Т.е. эта ошибка выбрасывается, когда нет возможности определить язык.
Со стороны пользователя библиотеки, нужно ловить и обрабатывать это исключение
Например, возвращать None:
@lru_cache(None)
def detect_cached(t):
try:
return detect(t)
except:
return
Если нужно конкретно обрабатывать это исключение:
from langdetect.lang_detect_exception import LangDetectException
...
@lru_cache(None)
def detect_cached(t):
try:
return detect(t)
except LangDetectException:
return
Насчёт параметра None я был ранее неправ - нужен либо он, либо скобки, я почему-то был уверен, что (этот) декоратор можно использовать без скобок и это так прямо и приведено в примерах в документации к каким-то версиям Python. Но в других версиях и в текущей версии в Google Colab скобки нужны, странно.
Но только не надо делать detect(word2), у вас в word2 уже есть результат определения языка, его и надо сравнивать с 'uk' и т.д. Перечитайте мой код из ответа вам на предыдущий вопрос.
Кстати, сравнения тоже можно перенести в кеширующую функцию и возвращать оттуда уже true/false для if, но это только после того как разберетесь с текущим кодом делайте, а то запутаетесь.
А в главном уважаемый @gil9red совершенно прав - ошибка была при невозможности детектировать язык и надо было это обернуть в try/catch.
Вообще, судя по всему, данная библиотека очень плохо детектирует языки, потестируйте на ваших данных другие библиотеки