Убедитесь, что ваши настроения и текстовая аналитика действительно обрабатывают символы на вашем целевом языке.

Одна из самых важных частей работы с технологиями и данными - продолжать учиться. Не только курсы, но и случайный вызов самому себе, чтобы узнать что-то совершенно новое.

Я решил использовать генератор случайных чисел для идентификации пакетов в первых 20 пакетах python, загруженных в соответствии с Python Wheels. Я постараюсь использовать каждый пакет, который мне «назначен». Моя цель - узнавать что-то новое, а бонус - обнаруживать скрытый драгоценный камень.



Случайный выбор: # 10 chardet 3.0.4 Универсальный детектор кодировки символов



Что это?

Этот пакет может оценить блок текста и попытаться определить, есть ли какие-либо символы. Это можно использовать для файлов или веб-страниц.

Это список возможных оценок.

  • ASCII, UTF-8, UTF-16 (2 варианта), UTF-32 (4 варианта)
  • Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (традиционный и упрощенный китайский)
  • EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (японский)
  • EUC-KR, ISO-2022-KR (корейский)
  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859–5, windows-1251 (кириллица)
  • ISO-8859–5, windows-1251 (на болгарском языке)
  • ISO-8859–1, windows-1252 (западноевропейские языки)
  • ISO-8859–7, windows-1253 (греческий)
  • ISO-8859–8, windows-1255 (визуальный и логический иврит)
  • TIS-620 (тайский)

Зачем мне это использовать?

Содержит ли объект, который анализирует код, символы? Если вы выполняете анализ тональности или читабельности, вы хотите быть уверены, что не тратите ресурсы на недействительный текст. Он также пытается определить язык.

Мой код, исследующий пакет:

Когда я запустил программу pip install chardet, я был уведомлен, что у меня уже установлен этот пакет. Я полагаю, это должно зависеть от другого более крупного пакета НЛП.

Я пробовал разные сайты, в том числе неанглоязычные. Мои результаты не сильно менялись. Я даже перезапустил ядро, думая, что это какая-то проблема с памятью. Не было. Пакет также не идентифицировал язык как английский на веб-странице. Учитывая, сколько кода размещено на веб-страницах, на первый взгляд это кажется разумным.

Обнаружить

# Simple example of determining if a webpage contains characters.  detect
import urllib
import chardet
data = urllib.request.urlopen('https://trends.google.com/trends/?geo=US').read()
chardet.detect(data)
"""output : {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
meaning: The package detects utf-8 characters on the Google Trends website, with a confidence level of 99%

Универсальный детектор

# Incrementally analyzing data and stopping when significance is reached
import urllib
from chardet.universaldetector import UniversalDetector
data = urllib.request.urlopen('https://trends.google.com/trends/?geo=US')
detector = UniversalDetector()
for line in data.readlines():
    print(line)
    detector.feed(line)
    if detector.done: break
detector.close()
data.close()
print(detector.result)
"""output: {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}"""

Не впечатленный анализом веб-страницы, я попробовал какой-то текст.

## Let’s try some straight up text compliments of Mr Poe.
import chardet
data = ‘Once upon a midnight dreary, while I pondered, weak and weary, \
Over many a quaint and curious volume of forgotten lore — \
 While I nodded, nearly napping, suddenly there came a tapping, \
As of some one gently rapping, rapping at my chamber door.’
print(chardet.detect(data.encode()))
# output {‘encoding’: ‘Windows-1252’, ‘confidence’: 0.73, ‘language’: ‘’}
# Windows-1252 = Western European Languages
# I get the same result if I don't continue the lines.

Если я использую только первую строку стихотворения, я получу другой результат.

data = 'Once upon a midnight dreary, while I pondered, weak and weary'
print(chardet.detect(data.encode()))
# output {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

Попробуем другой текст.

data = 'This is my rifle. There are many like it, but this one is mine.'
print(chardet.detect(data.encode()))
# output {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}

Опять без языка. Я поискал в Интернете и нашел другие примеры.

print(chardet.detect('test'.encode()))
print(chardet.detect('בדיקה'.encode()))
print(chardet.detect('тест'.encode()))
print(chardet.detect('テスト'.encode()))
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
{'encoding': 'utf-8', 'confidence': 0.9690625, 'language': ''}
{'encoding': 'utf-8', 'confidence': 0.938125, 'language': ''}
{'encoding': 'utf-8', 'confidence': 0.87625, 'language': ''}

Альтернативы

Изучая, почему мой код не возвращал языки и давал противоречивые результаты, я понял, что это распространенная проблема. С языками сложно, это очевидно. Я исследовал некоторые из предложенных альтернатив.

текстовый блок

"""
textblob  
https://textblob.readthedocs.io/en/dev/api_reference.html
"""
from textblob import TextBlob
mixed_text = u"""
 中国  中國
"""
data = TextBlob(mixed_text)
data.detect_language()
# Be forewarned that this calls Google Translate. I found it quickly errors out HTTP Error 429: Too Many Requests

полиглот

""" polyglot
 https://pypi.org/project/polyglot/
 A recommended alternative is polyglot if you are able to install it. I'm using Windows so it was giving me fits.
"""
from polyglot.detect import Detector
mixed_text = u"""
China (simplified Chinese: 中国; traditional Chinese: 中國),
officially the People's Republic of China (PRC), is a sovereign state
located in East Asia.
"""
for language in Detector(mixed_text).languages:
        print(language)
# name: English     code: en       confidence:  87.0 read bytes:  1154
# name: Chinese     code: zh_Hant  confidence:   5.0 read bytes:  1755
# name: un          code: un       confidence:   0.0 read bytes:     0

langdetect

"""
langdetect
https://pypi.org/project/langdetect/
"""
from langdetect import detect_langs
mixed_text = u"""
China (simplified Chinese: 中国; traditional Chinese: 中國),
officially the People's Republic of China (PRC), is a sovereign state
located in East Asia.
"""
detect_langs(mixed_text)
# output: [en:0.999996237910494]
#===================================================================
mixed_text = u"""
中国
"""
detect_langs(mixed_text)
# output[zh-cn:0.9999989751891187]
#==================================================================
mixed_text = u"""
тест
"""
detect_langs(mixed_text)
# output [bg:0.9999927872360368]

Заключение

По идее, этот пакет chardet определенно полезен для задач текстовой аналитики / НЛП в Python. Когда я пытался оценить неанглоязычные веб-сайты, всегда возвращалась кодировка utf-8.

Дальнейшие исследования в Интернете показывают, что chardet должен быть вашим последним средством из-за известных проблем. Учитывая ограничения, я предполагаю, что популярность этого пакета является результатом его включения в более крупные пакеты, такие как textract и text2math.

Итак - в общем, интересно узнать, что происходит за кулисами в других более крупных пакетах, которые используют chardet, и иметь интуитивное представление о точности и ограничениях, которые следует учитывать.

Табель успеваемости chardet:

Стоит ли погружаться в пакет? Да

Это скрытый драгоценный камень? Нет