Python: Làm thế nào để xác định ngôn ngữ?


86

Tôi muốn lấy cái này:

Input text: "ру́сский язы́к"
Output text: "Russian" 

Input text: "中文"
Output text: "Chinese" 

Input text: "にほんご"
Output text: "Japanese" 

Input text: "العَرَبِيَّة"
Output text: "Arabic"

Làm thế nào tôi có thể làm điều đó trong python? Cảm ơn.


2
Bạn đã thử những gì?
Raskayu


Tóm tắt độc đáo tại đây stackoverflow.com/a/48436520/2063605
SNA

Câu trả lời:


57

Bạn đã xem qua langdetect chưa?

from langdetect import detect

lang = detect("Ein, zwei, drei, vier")

print lang
#output: de

26
Không chính xác lắm - phát hiện ngôn ngữ của văn bản 'cấu trúc giải phẫu' là ro(tiếng Romania). Yêu cầu đầu ra nhiều ngôn ngữ cho những trường hợp như vậy. polyglot hoạt động tốt hơn nhiều.
Yuriy Petrovskiy

1
Thú vị, cho ví dụ tương tự langdetectcó thể xác định ngôn ngữ khác nhau :-)
Denis Kuzin

1
đối với một số lý do, langdetect được đưa ra lỗi, tôi đang sử dụng Python 3.6
ám chỉ

185
  1. TextBlob . Yêu cầu gói NLTK, sử dụng Google.

    from textblob import TextBlob
    b = TextBlob("bonjour")
    b.detect_language()
    

    pip install textblob

  2. Đa ngôn . Yêu cầu thư viện phức tạp và một số thư viện phức tạp, không có khả năng làm cho nó hoạt động cho Windows . (Đối với Windows, hãy tải phiên bản thích hợp của PyICU , MorfessorPyCLD2 từ đây , sau đó chỉ cần pip install downloaded_wheel.whl.) Có thể phát hiện các văn bản có ngôn ngữ hỗn hợp.

    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
    

    pip install polyglot

    Để cài đặt các phụ thuộc, hãy chạy: sudo apt-get install python-numpy libicu-dev

  3. chardet cũng có tính năng phát hiện ngôn ngữ nếu có byte ký tự trong phạm vi (127-255]:

    >>> chardet.detect("Я люблю вкусные пампушки".encode('cp1251'))
    {'encoding': 'windows-1251', 'confidence': 0.9637267119204621, 'language': 'Russian'}
    

    pip install chardet

  4. langdetect Yêu cầu phần lớn văn bản. Nó sử dụng phương pháp tiếp cận không xác định. Điều đó có nghĩa là bạn nhận được các kết quả khác nhau cho cùng một mẫu văn bản. Các tài liệu cho biết bạn phải sử dụng mã sau để xác định:

    from langdetect import detect, DetectorFactory
    DetectorFactory.seed = 0
    detect('今一はお前さん')
    

    pip install langdetect

  5. guess_language Có thể phát hiện mẫu rất ngắn bằng cách sử dụng này kiểm tra chính tả với từ điển.

    pip install guess_language-spirit

  6. langid cung cấp cả hai mô-đun

    import langid
    langid.classify("This is a test")
    # ('en', -54.41310358047485)
    

    và một công cụ dòng lệnh:

    $ langid < README.md
    

    pip install langid

  7. FastText là một công cụ phân loại văn bản, có thể được sử dụng để nhận ra 176 ngôn ngữ với một mô hình thích hợp để phân loại ngôn ngữ . Tải xuống mô hình này , sau đó:

    import fasttext
    model = fasttext.load_model('lid.176.ftz')
    print(model.predict('الشمس تشرق', k=2))  # top 2 matching languages
    
    (('__label__ar', '__label__fa'), array([0.98124713, 0.01265871]))
    

    pip install fasttext

  8. pyCLD3 là một mô hình mạng nơ-ron để nhận dạng ngôn ngữ. Gói này chứa mã suy luận và mô hình được đào tạo.

    import cld3
    cld3.get_language("影響包含對氣候的變化以及自然資源的枯竭程度")
    
    LanguagePrediction(language='zh', probability=0.999969482421875, is_reliable=True, proportion=1.0)
    

    pip install pycld3


2
detectlangnhanh hơnTextblob
Anwarvic

6
@Anwarvic TextBlob sử dụng Google API ( github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33 )! đó là lý do tại sao nó chậm.
Thomas Decaux

3
polyglotđã trở thành người hoạt động tốt nhất cho trường hợp sử dụng của tôi. langidđứng thứ hai
jamescampbell

3
Bạn thực sự không phải xử lý toàn bộ gói Polyglot nếu phát hiện ngôn ngữ là thứ duy nhất bạn cần. Như đã nêu trong tài liệu , việc phát hiện được thực hiện bởi pyCLD2 , một thư viện rất đơn giản và dễ sử dụng.
Jeyekomon

1
Ngoài ra còn có pyCLD3 .
tttthomasssss

7

Có một vấn đề với langdetectkhi nó đang được sử dụng để song song hóa và nó không thành công. Nhưng spacy_langdetectlà một trình bao bọc cho điều đó và bạn có thể sử dụng nó cho mục đích đó. Bạn cũng có thể sử dụng đoạn mã sau:

import spacy
from spacy_langdetect import LanguageDetector

nlp = spacy.load("en")
nlp.add_pipe(LanguageDetector(), name="language_detector", last=True)
text = "This is English text Er lebt mit seinen Eltern und seiner Schwester in Berlin. Yo me divierto todos los días en el parque. Je m'appelle Angélica Summer, j'ai 12 ans et je suis canadienne."
doc = nlp(text)
# document level language detection. Think of it like average language of document!
print(doc._.language['language'])
# sentence level language detection
for i, sent in enumerate(doc.sents):
    print(sent, sent._.language)

Tôi đã theo dõi câu trả lời của bạn, nhưng tôi nghĩ rằng tôi vẫn đang nhận được tốc độ tương tự như với langdetect. Tôi có một cột DF với các văn bản, tôi đang sử dụng column.apply()với một chức năng đang làm scipy_langdetect. Bất kỳ đề xuất?
Rishabh Sahrawat

Bạn cần sử dụng một thư viện song song để có thể tận dụng tính năng song song của chức năng như thế nào dask, nếu không nó sẽ không tạo ra bất kỳ sự khác biệt nào.
Habib Karbasian

3

Nếu bạn đang tìm kiếm một thư viện mà là nhanh chóng với các văn bản dài , polyglotfastextđang làm công việc tốt nhất ở đây.

Tôi đã lấy mẫu 10000 tài liệu từ một bộ sưu tập các HTML ngẫu nhiên và bẩn thỉu và đây là kết quả:

+------------+----------+
| Library    | Time     |
+------------+----------+
| polyglot   | 3.67 s   |
+------------+----------+
| fasttext   | 6.41     |
+------------+----------+
| cld3       | 14 s     |
+------------+----------+
| langid     | 1min 8s  |
+------------+----------+
| langdetect | 2min 53s |
+------------+----------+
| chardet    | 4min 36s |
+------------+----------+

Tôi nhận thấy rằng rất nhiều phương pháp tập trung vào các văn bản ngắn, có lẽ vì đó là vấn đề khó giải quyết: nếu bạn có nhiều văn bản, thì việc phát hiện ngôn ngữ thực sự rất dễ dàng (ví dụ như người ta có thể sử dụng từ điển!). Tuy nhiên, điều này gây khó khăn cho việc tìm kiếm một phương pháp dễ dàng và phù hợp cho các bài văn dài.


polyglotphát hiện ngôn ngữ dựa trên pycld2, điều đó không nhanh như vậy. Hoặc có cách nào sử dụng nó để xác định ngôn ngữ trong một loại chế độ hàng loạt không? Tôi đã chỉ thử xử lý từng câu một.
Wiktor Stribiżew

Tôi giả định rằng văn bản dài là cùng một ngôn ngữ. Tôi đọc 10000 tài liệu và giữ chúng trong bộ nhớ. Đối với fastextcc, tôi phải xóa các \nký tự, nhưng không phải đối với đa ngôn ngữ (kết quả cdl2 khá giống nhau, tôi cũng đã thử nghiệm nó). Tôi không hiểu tại sao bạn nghĩ rằng đa thức là chậm, Nó là nhanh nhất. Bạn có nghĩ rằng tôi cũng nên xóa câu đó không \n, và kết quả của tôi chỉ phản ánh câu đầu tiên (tức là trước câu đầu tiên \n)
toto_tico

Ý tôi là, tôi kiểm tra ngôn ngữ của hàng triệu tài liệu riêng biệt mà tất cả đều là chuỗi một dòng. Đó là chậm với pycld2.
Wiktor Stribiżew

Tôi hiểu rồi, tôi không nghĩ có cách nào để làm điều đó. Bạn phải làm từng việc một. Tùy thuộc vào nơi tài liệu của bạn được lưu trữ, bạn có thể sử dụng các khả năng đa xử lý. Ngoài ra, tôi đã ngừng sử dụng fasttextcc vì tôi gặp một số rắc rối với mã hóa ngôn ngữ Châu Á.
toto_tico

Trong trường hợp của tôi, hầu hết các tài liệu đều dài và điểm chuẩn có thể rất khác với các câu ngắn.
toto_tico

2

Tùy thuộc vào trường hợp, bạn có thể quan tâm đến việc sử dụng một trong các phương pháp sau:

Phương pháp 0: Sử dụng API hoặc thư viện

Thông thường, có một số vấn đề với các thư viện này vì một số trong số chúng không chính xác đối với văn bản nhỏ, một số ngôn ngữ bị thiếu, chậm, yêu cầu kết nối internet, không miễn phí, ... Nhưng nói chung, chúng sẽ phù hợp với hầu hết các nhu cầu .

Phương pháp 1: Mô hình ngôn ngữ

Một mô hình ngôn ngữ cho chúng ta xác suất của một chuỗi các từ. Điều này rất quan trọng vì nó cho phép chúng tôi phát hiện mạnh mẽ ngôn ngữ của văn bản, ngay cả khi văn bản có chứa các từ ở các ngôn ngữ khác (ví dụ: "'Hola' có nghĩa là 'xin chào' trong tiếng Tây Ban Nha" ).

Bạn có thể sử dụng N mô hình ngôn ngữ (một mô hình cho mỗi ngôn ngữ), để cho điểm văn bản của bạn. Ngôn ngữ được phát hiện sẽ là ngôn ngữ của mô hình đã cho bạn điểm cao nhất.

Nếu bạn muốn xây dựng một mô hình ngôn ngữ đơn giản cho điều này, tôi sẽ chọn 1 gam. Để làm điều này, bạn chỉ cần đếm số lần mỗi từ trong một văn bản lớn (ví dụ: Wikipedia Corpus bằng ngôn ngữ "X") đã xuất hiện.

Sau đó, xác suất của một từ sẽ là tần số của nó chia cho tổng số từ được phân tích (tổng của tất cả các tần số).

the 23135851162
of  13151942776
and 12997637966
to  12136980858
a   9081174698
in  8469404971
for 5933321709
...

=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")

Nếu văn bản cần phát hiện khá lớn, tôi khuyên bạn nên lấy mẫu N từ ngẫu nhiên và sau đó sử dụng tổng logarit thay vì phép nhân để tránh các vấn đề về độ chính xác dấu phẩy động.

P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376

Phương pháp 2: Các tập hợp giao nhau

Một cách tiếp cận đơn giản hơn nữa là chuẩn bị N bộ (một bộ cho mỗi ngôn ngữ) với M từ thường xuyên nhất. Sau đó, giao văn bản của bạn với mỗi bộ. Nhóm có số lượng giao lộ cao nhất sẽ là ngôn ngữ được phát hiện của bạn.

spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...

text_set = {"hola", "means", "hello", "in", "spanish"}

spanish_votes = text_set.intersection(spanish_set)  # 1
english_votes = text_set.intersection(english_set)  # 4
czech_votes = text_set.intersection(czech_set)  # 0
...

Phương pháp 3: Nén zip

Điều này gây tò mò hơn bất cứ điều gì khác, nhưng đây là ... Bạn có thể nén văn bản của mình (ví dụ LZ77) và sau đó đo khoảng cách zip liên quan đến văn bản nén tham chiếu (ngôn ngữ đích). Cá nhân tôi không thích nó vì nó chậm hơn, kém chính xác và ít mô tả hơn các phương pháp khác. Tuy nhiên, có thể có những ứng dụng thú vị cho phương pháp này. Để đọc thêm: Cây Ngôn ngữ và Khai báo


2

Bạn có thể sử dụng Googletrans (không chính thức), một API Google dịch miễn phí và không giới hạn cho Python.

Bạn có thể đưa ra bao nhiêu yêu cầu tùy thích, không có giới hạn

Cài đặt:

$ pip install googletrans

Phát hiện ngôn ngữ:

>>> from googletrans import Translator
>>> t = Translator().detect("hello world!")
>>> t.lang
'en'
>>> t.confidence
0.8225234

1

Mô hình văn bản nhanh được xử lý trước hoạt động tốt nhất cho nhu cầu tương tự của tôi

Tôi đã đến câu hỏi của bạn với một nhu cầu rất giống nhau. Tôi tìm thấy sự trợ giúp nhiều nhất từ ​​câu trả lời của Rabash cho các nhu cầu cụ thể của tôi.

Sau khi thử nghiệm để tìm ra những gì hoạt động tốt nhất trong số các đề xuất của anh ấy, đó là đảm bảo rằng các tệp văn bản bằng tiếng Anh trong hơn 60.000 tệp văn bản, tôi thấy rằng fasttext là một công cụ tuyệt vời cho một công việc như vậy.

Với một chút công việc, tôi đã có một công cụ hoạt động rất nhanh trên nhiều tệp. Nhưng nó có thể dễ dàng sửa đổi đối với một số trường hợp như trường hợp của bạn, bởi vì fasttext hoạt động trên một danh sách các dòng một cách dễ dàng.

Mã của tôi có nhận xét nằm trong số các câu trả lời trên bài đăng NÀY . Tôi tin rằng bạn và những người khác có thể dễ dàng sửa đổi mã này cho các nhu cầu cụ thể khác.


0

Bạn có thể thử xác định nhóm ký tự Unicode trong chuỗi đầu vào để chỉ ra loại ngôn ngữ, (ví dụ: Cyrillic cho tiếng Nga), rồi tìm kiếm các ký hiệu dành riêng cho ngôn ngữ trong văn bản.


0

Tôi đã thử tất cả các thư viện hiện có và tôi kết luận rằng pycld2 là thư viện tốt nhất, nhanh và chính xác.

bạn có thể cài đặt nó như thế này:

python -m pip install -U pycld2

bạn có thể sử dụng nó như thế này:

isReliable, textBytesFound, details = cld2.detect(your_sentence)

print(isReliable, details[0][1]) # reliablity(bool),lang abbrev.(en/es/de...)   
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.