Hướng dẫn fast language detection python - Python phát hiện ngôn ngữ nhanh

1

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đang sử dụng DASK để tính toán song song và muốn phát hiện ngôn ngữ của các câu trong một cột bằng cách sử dụng

df.compute(scheduler="processes")
1. Tuy nhiên, tôi vẫn không thể đạt được bất kỳ tốc độ nào trong việc có được ngôn ngữ của các hàng trong cột.

Dưới đây là mã của tôi:

import dask.dataframe as dd
data = dd.read_csv('name.csv')# has a column called short_description
def some_fn(e):
    return e['short_description'].apply(langdetect.detect)

data['Language'] = data.map_partitions(some_fn, meta='string')# adding a new column called Language.

Tệp CSAV này có 800000 hàng mỗi hàng chứa khoảng. 20 từ câu dài.

Bất kỳ đề xuất nào làm thế nào tôi có thể đạt được phát hiện ngôn ngữ nhanh hơn vì hiện tại phải mất 2-3 giờ.

hỏi ngày 2 tháng 4 năm 2020 lúc 15:47Apr 2, 2020 at 15:47

Hướng dẫn fast language detection python - Python phát hiện ngôn ngữ nhanh

Theo mặc định, data DataFrame sử dụng một nhóm luồng để xử lý. Tôi đoán là thuật toán phát hiện ngôn ngữ của bạn được viết bằng python thuần túy (chứ không phải c/cython giống như hầu hết các gấu trúc) và do đó bị giới hạn bởi Gil. Điều này có nghĩa là bạn nên sử dụng các quy trình thay vì chủ đề. Bạn có thể yêu cầu DASK sử dụng các quy trình bằng cách thêm từ khóa

df.compute(scheduler="processes")
2 vào bất kỳ cuộc gọi tính toán hoặc liên tục nào

df.compute(scheduler="processes")

Thông tin thêm về các trình lập lịch khác nhau của Dask và khi nào nên sử dụng chúng ở đây: https://docs.dask.org/en/latest/scheduling.html

Đã trả lời ngày 4 tháng 4 năm 2020 lúc 16:32Apr 4, 2020 at 16:32

Hướng dẫn fast language detection python - Python phát hiện ngôn ngữ nhanh

MrocklinmrocklinMRocklin

53.4K21 Huy hiệu vàng147 Huy hiệu bạc221 Huy hiệu đồng21 gold badges147 silver badges221 bronze badges

3

Bắt đầu

Bốn công cụ Python để xác định ngôn ngữ của văn bản của bạn và bài kiểm tra tốc độ và độ chính xác

Ảnh của Jacqueline Brandwayn trên unplash

Hầu hết các ứng dụng NLP có xu hướng dành riêng cho ngôn ngữ và do đó yêu cầu dữ liệu đơn ngữ. Để xây dựng một ứng dụng bằng ngôn ngữ mục tiêu của bạn, bạn có thể cần áp dụng một kỹ thuật tiền xử lý lọc văn bản được viết bằng các ngôn ngữ không phải mục tiêu. Điều này đòi hỏi phải xác định đúng ngôn ngữ của từng ví dụ đầu vào. Dưới đây tôi liệt kê một số công cụ bạn có thể sử dụng làm mô -đun Python cho yêu cầu tiền xử lý này và cung cấp một điểm chuẩn hiệu suất đánh giá tốc độ và độ chính xác của từng người.

1) Langdetect

df.compute(scheduler="processes")
1 là một sự hình thành lại của thư viện phát hiện ngôn ngữ Google từ Java đến Python. Chỉ cần chuyển văn bản của bạn cho hàm
df.compute(scheduler="processes")
4 đã nhập và nó sẽ xuất mã hai chữ ISO 693 của ngôn ngữ mà mô hình cho điểm tin cậy cao nhất. .

from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]

Một vài điểm tô điểm:

  1. Các nhà sản xuất thư viện khuyên bạn nên đặt hạt giống
    df.compute(scheduler="processes")
    
    6 thành một số. Điều này là do thuật toán Langdetect, không giải quyết được, điều đó có nghĩa là nếu bạn cố gắng chạy nó trên một văn bản mà quá ngắn hoặc quá mơ hồ, bạn có thể nhận được kết quả khác nhau mỗi khi bạn chạy nó. Đặt hạt giống thực thi kết quả nhất quán trong quá trình phát triển/đánh giá.
  2. Bạn cũng có thể muốn bao quanh cuộc gọi
    df.compute(scheduler="processes")
    
    4 trong một thử/ngoại trừ khối với
    df.compute(scheduler="processes")
    
    8, nếu không bạn có thể sẽ nhận được không có tính năng nào trong lỗi văn bản, xảy ra khi có ngôn ngữ của đầu vào đã cho không thể được đánh giá như URL, số, công thức, v.v.
from langdetect import DetectorFactory, detect
from langdetect.lang_detect_exception import LangDetectException
DetectorFactory.seed = 0def is_english(text):
try:
if detect(text) != "en":
return False
except LangDetectException:
return False
return True

2) Máy dò ngôn ngữ Spacy

Nếu bạn sử dụng Spacy cho nhu cầu NLP của mình, bạn có thể thêm thành phần phát hiện ngôn ngữ tùy chỉnh vào đường ống Spacy hiện tại của mình, sẽ cho phép bạn đặt thuộc tính mở rộng có tên

df.compute(scheduler="processes")
9 trên đối tượng
from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]
0. Thuộc tính này sau đó có thể được truy cập thông qua
from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]
1, sẽ trả về ngôn ngữ dự đoán cùng với xác suất của nó.

import spacy
from spacy_langdetect import LanguageDetector
text2 = 'In 1793, Alexander Hamilton recruited Webster to move to New York City and become an editor for a Federalist Party newspaper.'nlp = spacy.load('en_core_web_sm')
nlp.add_pipe(LanguageDetector(), name='language_detector', last=True)
doc = nlp(text)
doc._.language # {'language': 'en', 'score': 0.9999978351575265}

3) Langid

Langid tự hào về tốc độ của nó nói riêng (nhiều hơn về điều này dưới đây). Nó hoạt động tương tự như các công cụ trên, nhưng nó cũng có thể được sử dụng như một công cụ dòng lệnh bằng cách chạy

from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]
2. Kiểm tra repo của họ để biết thêm chi tiết và các tùy chọn khác.

Để sử dụng Langid làm thư viện Python, hãy sử dụng hàm

from langdetect import DetectorFactory, detect, detect_langstext = "My lubimy mleko i chleb."detect(text) #  'cs'
detect_langs(text) # [cs:0.7142840957132709, pl:0.14285810606233737, sk:0.14285779665739756]
3:

import langidlangid.classify(text2)  # ('en', -127.75649309158325)

Bạn có thể hiệu chỉnh dự đoán xác suất, ban đầu được tính toán trong không gian xác suất log, theo những gì có thể được hiểu là điểm số tự tin trong phạm vi từ 0 đến 1:

from langid.langid import LanguageIdentifier, modellang_identifier = LanguageIdentifier.from_modelstring(model, norm_probs=True)
lang_identifier.classify(text2) # ('en', 0.999999999999998)

4) Fasttext

Fasttext lưu ý rằng mô hình nhận dạng ngôn ngữ được đào tạo trước của nó mất ít hơn 1MB bộ nhớ trong khi có thể phân loại hàng ngàn tài liệu mỗi giây.

Tải xuống một mô hình bạn chọn:

  • nắp.176.bin: nhanh hơn và chính xác hơn một chút (kích thước tệp = 126MB).
  • LID.176.FTZ: Phiên bản nén của mô hình (kích thước tệp = 917kb).
import fasttext

path_to_pretrained_model = '/tmp/lid.176.bin'
fmodel = fasttext.load_model(path_to_pretrained_model)
fmodel.predict([text2]) # ([['__label__en']], [array([0.9331119], dtype=float32)]

Tốc độ 🚅

Nếu bạn có kế hoạch sử dụng ứng dụng của mình yêu cầu nhận dạng ngôn ngữ trong sản xuất, tốc độ có thể là một cân nhắc quan trọng đối với bạn. Dưới đây là một điểm chuẩn nhanh chóng của bốn công cụ được mô tả ở trên.

Tôi đã tải xuống một bộ dữ liệu gồm 10.502 tweet từ Kaggle, được lấy mẫu ngẫu nhiên từ các tin nhắn Twitter được gắn thẻ công khai có nguồn gốc từ 130 quốc gia khác nhau. Họ được chú thích vì bằng tiếng Anh hoặc không phải tiếng Anh, trong số các tính năng khác.

Nguồn dữ liệu: https://www.kaggle.com/rtatman/the-umass-global-english-on-twitter-dataSet.

Bộ dữ liệu
import pandas as pddf = pd.read_csv('all_annotated.tsv', sep='\t')
Kaggle sáu hàng đầu tiên

Kết quả của bài kiểm tra tốc độ!

Kết quả kiểm tra tốc độ

Fasttext chỉ mất 129 ms để dự đoán trên hơn 10.000 datapoints. Langid đứng thứ hai và các ứng cử viên khác có nhiều thứ tự chậm hơn.

Độ chính xác 🔬

from sklearn.metrics import accuracy_scoreytrue = df['Definitely English'].to_list()
tweets = df['Tweet'].to_list()
# get the predictions of each detectorlangdetect_preds = [lang_detect(t) for t in tweets]
spacy_preds = [nlp(t)._.language['language'] for t in tweets]
langid_preds = [lang_identifier.classify(text)[0] for t in tweets]
fasttext_preds = [p[0].replace('__label__', '') for p in fmodel.predict(tweets)[0]]
# binarize the labelslangdetect_preds_binary = [1 if p == 'en' else 0 for p in langdetect_preds]
spacy_preds_binary = [1 if p == 'en' else 0 for p in spacy_preds]
langid_preds_binary = [1 if p == 'en' else 0 for p in langid_preds]
fasttext_preds_binary = [1 if p == 'en' else 0 for p in fasttext_preds]
# evaluate accuracy against the true labels (1 for English, 0 otherwise)accuracy_score(ytrue, langdetect_preds_binary) # 0.8448866882498571
accuracy_score(ytrue, spacy_preds_binary) # 0.8448866882498571
accuracy_score(ytrue, langid_preds_binary) # 0.8268901161683488
accuracy_score(ytrue, fasttext_preds_binary) # 0.8598362216720624

Fasttext có điểm chính xác cao nhất, tiếp theo là Langdetect và Spacy-Langdetect. Một cái gì đó cho tôi biết rằng Spacy-Langdetect chỉ là langdetect dưới mui xe. ;) (Họ có chính xác điểm chính xác giống nhau và điều đó cũng sẽ giải thích các tên thư viện tương tự.)

Và để có biện pháp tốt, đây là độ chính xác, nhớ lại và điểm F1 cho mỗi mô hình.

df.compute(scheduler="processes")
0

Lấy đi

Tôi sẽ đi với fasttext nếu bạn xử lý một bộ dữ liệu rất lớn.