Python: จะกำหนดภาษาได้อย่างไร?


88

ฉันต้องการรับสิ่งนี้:

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

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

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

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

ฉันจะทำมันใน python ได้อย่างไร? ขอบคุณ.


4
คุณลองทำอะไร
Raskayu

1
สิ่งนี้อาจช่วยได้stackoverflow.com/questions/4545977/…
Sardorbek Imomaliev

สรุปไว้อย่างดีที่นี่stackoverflow.com/a/48436520/2063605
SNA

คำตอบ:


57

คุณเคยดูlangdetectหรือยัง?

from langdetect import detect

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

print lang
#output: de

28
ไม่ถูกต้องมากนัก - ตรวจพบภาษาของข้อความ "โครงสร้างทางกายวิภาค" เป็นro(โรมาเนีย) ต้องมีเอาต์พุตหลายภาษาสำหรับกรณีดังกล่าว พูดได้หลายภาษาทำงานได้ดีกว่ามาก
Yuriy Petrovskiy

2
ที่น่าสนใจสำหรับตัวอย่างเดียวกันlangdetectสามารถกำหนดภาษาต่างๆได้ :-)
Denis Kuzin

1
ด้วยเหตุผลบางประการ langdetect ได้รับข้อผิดพลาดฉันใช้ Python 3.6
เสียดสี

ไม่เคยได้ยินEin !!!
Timo

199
  1. TextBlob ต้องใช้แพ็คเกจ NLTK ใช้ Google

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

    pip install textblob

  2. ที่รู้หลายภาษา ต้อง numpy และบางห้องสมุดลับน่าจะได้รับการทำงานสำหรับ Windows (สำหรับ Windows ให้รับPyICU , MorfessorและPyCLD2เวอร์ชันที่เหมาะสมจากที่นี่จากนั้นก็แค่pip install downloaded_wheel.whlนั้น) สามารถตรวจจับข้อความที่มีภาษาผสมได้

    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

    ในการติดตั้งการอ้างอิงให้รัน: sudo apt-get install python-numpy libicu-dev

  3. chardetยังมีคุณสมบัติในการตรวจจับภาษาหากมีไบต์อักขระในช่วง (127-255):

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

    pip install chardet

  4. langdetectต้องการข้อความส่วนใหญ่ ใช้วิธีการที่ไม่ได้กำหนดภายใต้ประทุน นั่นหมายความว่าคุณจะได้ผลลัพธ์ที่แตกต่างกันสำหรับตัวอย่างข้อความเดียวกัน เอกสารบอกว่าคุณต้องใช้รหัสต่อไปนี้เพื่อกำหนด:

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

    pip install langdetect

  5. Guess_languageสามารถตรวจจับตัวอย่างสั้น ๆ ได้โดยใช้ตัวตรวจสอบการสะกดนี้กับพจนานุกรม

    pip install guess_language-spirit

  6. langidมีทั้งโมดูล

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

    และเครื่องมือบรรทัดคำสั่ง:

    $ langid < README.md
    

    pip install langid

  7. FastTextเป็นลักษณนามข้อความสามารถนำมาใช้ในการรับรู้ภาษาที่มี 176 ที่เหมาะสมแบบจำลองสำหรับการจำแนกภาษา ดาวน์โหลดโมเดลนี้จากนั้น:

    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เป็นแบบจำลองเครือข่ายประสาทสำหรับการระบุภาษา แพ็คเกจนี้ประกอบด้วยรหัสการอนุมานและแบบจำลองที่ได้รับการฝึกฝน

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

    pip install pycld3


2
detectlangเป็นวิธีที่เร็วกว่าTextblob
Anwarvic

7
@Anwarvic TextBlob ใช้ Google API ( github.com/sloria/TextBlob/blob/dev/textblob/translate.py#L33 )! ทำไมมันถึงช้า
Thomas Decaux

4
polyglotจบลงด้วยการเป็นผู้ที่มีประสิทธิภาพสูงสุดสำหรับกรณีการใช้งานของฉัน langidมาเป็นอันดับสอง
jamescampbell

3
คุณไม่จำเป็นต้องจัดการกับแพ็คเกจ Polyglot ทั้งหมดหากการตรวจจับภาษาเป็นสิ่งเดียวที่คุณต้องการ ตามที่ระบุไว้ในเอกสารการตรวจจับทำได้โดยpyCLD2ซึ่งเป็นไลบรารีที่ง่ายและใช้งานง่าย
Jeyekomon

1
นอกจากนี้ยังมีpyCLD3
tttthomasssss

7

มีปัญหาเกี่ยวกับlangdetectเวลาที่ใช้สำหรับการขนานและล้มเหลว แต่spacy_langdetectเป็นกระดาษห่อหุ้มสำหรับสิ่งนั้นและคุณสามารถใช้เพื่อจุดประสงค์นั้นได้ คุณสามารถใช้ตัวอย่างต่อไปนี้ได้เช่นกัน:

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)

ฉันทำตามคำตอบของคุณ แต่ฉันคิดว่าฉันยังคงได้รับความเร็วเช่นเดียวกับlangdetect. ฉันมีคอลัมน์ DF กับข้อความฉันใช้กับฟังก์ชั่นการทำcolumn.apply() scipy_langdetectข้อเสนอแนะใด ๆ ?
Rishabh Sahrawat

คุณต้องใช้ไลบรารีคู่ขนานเพื่อให้สามารถใช้ประโยชน์จากการขนานของฟังก์ชันเช่นdaskมิฉะนั้นจะไม่สร้างความแตกต่าง
Habib Karbasian

3

หากคุณกำลังมองหาห้องสมุดที่เป็นไปอย่างรวดเร็วกับข้อความยาว , polyglotและfastextมีการทำงานที่ดีที่สุดที่นี่

ฉันสุ่มตัวอย่างเอกสาร 10,000 รายการจากคอลเล็กชัน HTML ที่สกปรกและสุ่มและนี่คือผลลัพธ์:

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

ฉันสังเกตเห็นว่าหลายวิธีเน้นไปที่ข้อความสั้น ๆ อาจเป็นเพราะเป็นปัญหาที่ยากในการแก้ไข: หากคุณมีข้อความจำนวนมากการตรวจจับภาษานั้นง่ายมาก (เช่นสามารถใช้พจนานุกรมได้!) อย่างไรก็ตามสิ่งนี้ทำให้ยากที่จะหาวิธีที่ง่ายและเหมาะสมสำหรับข้อความยาว ๆ


polyglotการตรวจจับภาษาขึ้นอยู่กับpycld2ซึ่งไม่ได้เร็วขนาดนั้น หรือมีวิธีใช้เพื่อระบุภาษาในโหมดแบตช์หรือไม่? ฉันได้ลองจัดการทีละประโยคเท่านั้น
Wiktor Stribiżew

ฉันคิดว่าข้อความยาวเป็นภาษาเดียวกัน ฉันอ่านเอกสาร 10,000 ฉบับและเก็บไว้ในความทรงจำ สำหรับ fastextcc ฉันต้องลบ\nอักขระออก แต่ไม่ใช่สำหรับ polyglot (ผลลัพธ์ของ cdl2 ก็ค่อนข้างเหมือนกันฉันทดสอบด้วยเช่นกัน) ฉันไม่เข้าใจว่าทำไมคุณถึงคิดว่าพูดได้หลายภาษามันเร็วที่สุด คุณคิดว่าฉันควรจะลบออก\nเช่นกันและผลลัพธ์ของฉันก็สะท้อนประโยคแรก (เช่นก่อนหน้าแรก\n)
toto_tico

ฉันหมายถึงฉันตรวจสอบภาษาของเอกสารที่แยกจากกันนับล้านซึ่งเป็นสตริงบรรทัดเดียว ที่ช้ากับ pycld2
Wiktor Stribiżew

ฉันเข้าใจแล้วฉันไม่คิดว่าจะมีวิธีทำแบบนั้น คุณต้องทำทีละอย่าง ขึ้นอยู่กับตำแหน่งที่จัดเก็บเอกสารของคุณคุณจะสามารถใช้ความสามารถในการประมวลผลหลายขั้นตอนได้ นอกจากนี้ฉันสิ้นสุดการใช้ fasttextcc เนื่องจากฉันมีปัญหากับการเข้ารหัสภาษาเอเชีย
toto_tico

ในกรณีของฉันเอกสารส่วนใหญ่มีความยาวและเกณฑ์มาตรฐานอาจดูแตกต่างไปจากประโยคสั้น ๆ
toto_tico

3

คุณสามารถใช้Googletrans (ไม่เป็นทางการ) Google translate API สำหรับ Python ได้ฟรีและไม่ จำกัด

คุณสามารถร้องขอได้มากเท่าที่คุณต้องการโดยไม่มีข้อ จำกัด

การติดตั้ง:

$ pip install googletrans

การตรวจจับภาษา:

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

2

คุณอาจสนใจใช้วิธีใดวิธีหนึ่งต่อไปนี้ทั้งนี้ขึ้นอยู่กับกรณี:

วิธีที่ 0: ใช้ API หรือไลบรารี

โดยปกติแล้วจะมีปัญหาเล็กน้อยกับไลบรารีเหล่านี้เนื่องจากบางส่วนไม่ถูกต้องสำหรับข้อความขนาดเล็กบางภาษาหายไปช้าต้องเชื่อมต่ออินเทอร์เน็ตไม่ฟรี ... แต่โดยทั่วไปแล้วจะเหมาะกับความต้องการส่วนใหญ่ .

วิธีที่ 1: แบบจำลองภาษา

แบบจำลองภาษาทำให้เรามีความน่าจะเป็นของลำดับคำ สิ่งนี้มีความสำคัญเนื่องจากช่วยให้เราตรวจจับภาษาของข้อความได้อย่างมีประสิทธิภาพแม้ว่าข้อความนั้นจะมีคำในภาษาอื่น ๆ ก็ตาม (เช่น"" Hola "แปลว่า" สวัสดี "ในภาษาสเปน" )

คุณสามารถใช้แบบจำลองภาษา N (หนึ่งภาษาต่อหนึ่งภาษา) เพื่อให้คะแนนข้อความของคุณ ภาษาที่ตรวจพบจะเป็นภาษาของโมเดลที่ให้คะแนนสูงสุดแก่คุณ

ถ้าคุณต้องการสร้างแบบจำลองภาษาง่ายๆสำหรับสิ่งนี้ฉันจะไป 1 กรัม ในการดำเนินการนี้คุณจะต้องนับจำนวนครั้งที่แต่ละคำจากข้อความขนาดใหญ่ (เช่น Wikipedia Corpus ในภาษา "X") ปรากฏ

จากนั้นความน่าจะเป็นของคำจะเป็นความถี่หารด้วยจำนวนคำทั้งหมดที่วิเคราะห์ (ผลรวมของความถี่ทั้งหมด)

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 คำแบบสุ่มแล้วใช้ผลรวมของลอการิทึมแทนการคูณเพื่อหลีกเลี่ยงปัญหาความแม่นยำของทศนิยม

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

วิธีที่ 2: การตัดกันชุด

วิธีที่ง่ายกว่านั้นคือการเตรียมชุด N (หนึ่งชุดต่อภาษา) ด้วยคำที่ใช้บ่อยที่สุด M จากนั้นตัดข้อความของคุณกับแต่ละชุด ชุดที่มีจำนวนทางแยกมากที่สุดจะเป็นภาษาที่คุณตรวจพบ

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
...

วิธีที่ 3: การบีบอัด Zip

สิ่งนี้เป็นความอยากรู้อยากเห็นมากกว่าสิ่งอื่นใด แต่นี่เป็นไปได้ ... คุณสามารถบีบอัดข้อความของคุณ (เช่น LZ77) จากนั้นวัดระยะทางไปรษณีย์ตามข้อความที่บีบอัดข้อมูลอ้างอิง โดยส่วนตัวแล้วฉันไม่ชอบเพราะมันช้ากว่าไม่แม่นยำและอธิบายได้น้อยกว่าวิธีอื่น อย่างไรก็ตามอาจมีแอปพลิเคชั่นที่น่าสนใจสำหรับวิธีนี้ หากต้องการอ่านเพิ่มเติม: ต้นไม้ภาษาและการซิป


1

โมเดลข้อความด่วนที่กำหนดไว้ล่วงหน้าทำงานได้ดีที่สุดสำหรับความต้องการที่คล้ายกันของฉัน

ฉันมาถึงคำถามของคุณด้วยความต้องการที่คล้ายกันมาก ฉันพบความช่วยเหลือมากที่สุดจากคำตอบของ Rabash สำหรับความต้องการเฉพาะของฉัน

หลังจากทดลองเพื่อค้นหาสิ่งที่ได้ผลดีที่สุดจากคำแนะนำของเขาซึ่งทำให้แน่ใจว่าไฟล์ข้อความเป็นภาษาอังกฤษในไฟล์ข้อความมากกว่า 60,000 ไฟล์ฉันพบว่า fasttext เป็นเครื่องมือที่ยอดเยี่ยมสำหรับงานดังกล่าว

ด้วยการทำงานเพียงเล็กน้อยฉันมีเครื่องมือที่ทำงานได้เร็วมากกับไฟล์จำนวนมาก แต่สามารถแก้ไขได้ง่ายสำหรับบางอย่างเช่นกรณีของคุณเนื่องจาก fasttext ทำงานเหนือรายการบรรทัดได้อย่างง่ายดาย

รหัสของฉันที่มีความคิดเห็นเป็นหนึ่งในคำตอบในนี้โพสต์ ฉันเชื่อว่าคุณและคนอื่น ๆ สามารถแก้ไขรหัสนี้สำหรับความต้องการเฉพาะอื่น ๆ ได้อย่างง่ายดาย


0

คุณสามารถลองกำหนดกลุ่ม Unicode ของตัวอักษรในสตริงอินพุตเพื่อระบุประเภทของภาษา (ซีริลลิกสำหรับรัสเซียเป็นต้น) จากนั้นค้นหาสัญลักษณ์เฉพาะภาษาในข้อความ


0

ฉันลองใช้ไลบรารีทั้งหมดแล้วและฉันสรุปได้ว่า pycld2 เป็นไลบรารีที่ดีที่สุดรวดเร็วและแม่นยำ

คุณสามารถติดตั้งได้ดังนี้:

python -m pip install -U pycld2

คุณสามารถใช้มันได้ดังนี้:

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

print(isReliable, details[0][1]) # reliablity(bool),lang abbrev.(en/es/de...)   
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.