2010-02-24 12 views
25

मान लीजिए हम सामग्री के साथ एक पाठ फ़ाइल है: "जे संयुक्त राष्ट्र प्रेमी homme suis ..."मैं कैसे बता सकता हूं कि एक सादा-पाठ फ़ाइल कौन सी भाषा लिखी गई है?

दूसरे के साथ:

जर्मन में एक पाठ के साथ तीसरे "मैं एक बहादुर आदमी हूँ": "गुटेन मॉर्गन। वाई गेट्स?"

हम एक समारोह कैसे लिखते हैं जो हमें बताएगा: ऐसी संभावना के साथ पहली फ़ाइल में पाठ अंग्रेजी में है, दूसरे में फ्रेंच आदि है? पुस्तकों के लिए

लिंक/आउट-ऑफ-द-बॉक्स समाधान का स्वागत है। मैं जावा में लिखता हूं, लेकिन यदि आवश्यक हो तो मैं पाइथन सीख सकता हूं।

मेरी टिप्पणियों

  1. वहाँ एक छोटा सा टिप्पणी मैं जोड़ने की आवश्यकता है। पाठ में पूरी तरह से या गलती के परिणामस्वरूप, अलग-अलग भाषाओं में वाक्यांश हो सकते हैं। क्लासिक कूड़ेचर में हमारे पास बहुत सारे उदाहरण हैं, क्योंकि अभिजात वर्ग के सदस्य बहुभाषी थे। तो संभावना स्थिति की बेहतर व्याख्या करती है, क्योंकि पाठ के अधिकांश भाग एक भाषा में हैं, जबकि अन्य दूसरे में लिखे जा सकते हैं।
  2. Google एपीआई - इंटरनेट कनेक्शन। मैं रिमोट फ़ंक्शंस/सेवाओं का उपयोग नहीं करना चाहूंगा, क्योंकि मुझे इसे स्वयं करने की ज़रूरत है या डाउनलोड करने योग्य लाइब्रेरी का उपयोग करना है। मैं उस विषय पर एक शोध करना चाहता हूं। गूगल द्वारा
+0

@EugeneP: फ्रेंच अधिक होगा "जे संयुक्त राष्ट्र बेल homme suis ...";), लेकिन एक भाषा-डिटेक्टर उस गलती का पता की संभावना नहीं है (या कम से कम बहुत ही असामान्य उपयोग)। – SyntaxT3rr0r

+0

@WizardOfOdds जे संयुक्त राष्ट्र Bonhomme alors, merci, quand मेम suis;) – EugeneP

+2

इसके अलावा, आशा है कि आप पहले से ही इस जाँच: http://stackoverflow.com/questions/1383503/how-to-determine-the-natural-language-of- एक-दस्तावेज़ –

उत्तर

19

एक पैकेज JLangDetect कहा जाता है जो वास्तव में क्या करने के लिए आप क्या चाहते हैं लगता है:

langof("un texte en français") = fr : OK 
langof("a text in english") = en : OK 
langof("un texto en español") = es : OK 
langof("un texte un peu plus long en français") = fr : OK 
langof("a text a little longer in english") = en : OK 
langof("a little longer text in english") = en : OK 
langof("un texto un poco mas largo en español") = es : OK 
langof("J'aime les bisounours !") = fr : OK 
langof("Bienvenue à Montmartre !") = fr : OK 
langof("Welcome to London !") = en : OK 
// ... 

संपादित करें: के रूप में केविन ने कहा, वहाँ Nutch project में इसी तरह की सुविधा पैकेज org.apache.nutch.analysis.lang द्वारा प्रदान की है।

+0

क्यों कोई जर्मन उदाहरण है? – Chris

+0

@ क्रिस अच्छा, एक अच्छा सवाल है। मुझे केवल एक वाक्यांश पता है, चलो देखते हैं कि मैं इसे सही तरीके से लिख सकता हूं या नहीं। – EugeneP

+0

मैं नहीं जानता, लेकिन जर्मन समर्थित भाषा –

0

आप इंटरनेट से कनेक्शन है, तो आप तो गूगल भाषा एपीआई आप के लिए एकदम सही किया जाएगा मत करो।

// This example request includes an optional API key which you will need to 
// remove or replace with your own key. 
// Read more about why it's useful to have an API key. 
// The request also includes the userip parameter which provides the end 
// user's IP address. Doing so will help distinguish this legitimate 
// server-side traffic from traffic which doesn't come from an end-user. 
URL url = new URL(
    "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" 
    + "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS"); 
URLConnection connection = url.openConnection(); 
connection.addRequestProperty("Referer", /* Enter the URL of your site here */); 

String line; 
StringBuilder builder = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
while((line = reader.readLine()) != null) { 
builder.append(line); 
} 

JSONObject json = new JSONObject(builder.toString()); 
// now have some fun with the results... 

यदि आपके पास अन्य विधियां नहीं हैं।

3

मार्कोव चेन देखें।

मूल रूप से आप भाषाओं आप को पहचान करना चाहते हैं सांख्यिकीय महत्वपूर्ण नमूने की आवश्यकता होगी। जब आपको कोई नई फ़ाइल मिलती है, तो देखें कि विशिष्ट अक्षरों या फोनेम की आवृत्तियों क्या हैं, और पूर्व-गणना वाले नमूने की तुलना करें। निकटतम चुनें।

5

ग्रंथों की बड़ी corpi के लिए आप आम तौर पर पत्र, द्वि आलेख और यहां तक ​​कि trigraphs के वितरण का उपयोग करें और भाषाओं आप पता लगाने के लिए चाहते हैं के लिए जाना जाता वितरण के साथ तुलना करें।

हालांकि, एक एक वाक्य बहुत संभावना भी किसी भी उपयोगी सांख्यिकीय माप उपज के लिए कम है। फिर, शब्दकोश के साथ अलग-अलग शब्दों से मिलान करने के साथ आपको अधिक भाग्य हो सकता है।

2

हालांकि एक और अधिक जटिल समाधान की तुलना में आप देख रहे हैं, तो आप Vowpal wabbit का उपयोग करें और विभिन्न भाषाओं से वाक्य के साथ यह प्रशिक्षण दे सकते।

सिद्धांत में आप अपने दस्तावेज़ों में हर वाक्य के लिए एक भाषा वापस ले सकते हैं।

http://hunch.net/~vw/

(मत परियोजना के उपशीर्षक में से "ऑनलाइन" मूर्ख बनाया जा - स्मृति में पूरे सीखने सामग्री के बिना है कि बस सीखता के लिए mathspeak है)

+0

आपके उत्तर के लिए धन्यवाद। – EugeneP

4

NGramJ एक सा प्रतीत हो रहा है अधिक अप करने की तारीख:

http://ngramj.sourceforge.net/

यह भी दोनों चरित्र उन्मुख और बाइट उन्मुख प्रोफाइल है तो यह चरित्र भी सेट की पहचान करने में सक्षम होना चाहिए।

कई भाषाओं में दस्तावेज आप वर्ण सेट की पहचान करने की जरूरत है के लिए, तो कुछ कई पंक्ति विराम, या पैराग्राफ अगर पाठ में चिह्नित होता है की तरह सस्ती पर पाठ विभाजित (ICU4J एक CharsetDetector कि यह कर सकते हैं) है।

+0

आपके उत्तर के लिए धन्यवाद। – EugeneP

4

नच के Language Identifier आज़माएं। इसे भाषाओं के एन-ग्राम प्रोफाइल के साथ प्रशिक्षित किया जाता है और उपलब्ध भाषाओं की प्रोफाइल इनपुट टेक्स्ट से मेल खाती है। दिलचस्प बात यह है कि यदि आपको आवश्यकता हो तो आप और भाषाएं जोड़ सकते हैं।

+0

हम नच के भाषा पहचानकर्ता का बहुत अच्छे परिणाम के साथ उपयोग करते हैं। यह एक बड़े मॉडल का एक मानक कार्यान्वयन है जो एक चरित्र सेट साझा करने वाली भाषाओं के लिए काम करता है। –

2

आप व्यवस्था है जिसके द्वारा भाषा पहचान किया जा सकता है में रुचि रखते हैं, मैं आप निम्नलिखित article (आधारित अजगर) विशेष और में इस समस्या का (बहुत) अनुभवहीन विधि एक अच्छा परिचय का उपयोग करता है, लेकिन यह है कि को देखें मशीन सीखने (केवल एक बड़ा शब्द) सामान्य रूप से।

जावा कार्यान्वयन के लिए, अन्य पोस्टर्स द्वारा सुझाए गए अनुसार JLangDetect और Nutch बहुत अच्छे हैं। Lingpipe, JTCL और NGramJ पर भी एक नज़र डालें।


समस्या जहां एक ही पृष्ठ में कई भाषाओं राशि के लिए, आप वाक्य में एक पेज काटना एक वाक्य सीमा डिटेक्टर का प्रयोग और उसके बाद प्रत्येक वाक्य की भाषा की पहचान करने का प्रयास कर सकते हैं। यह मानते हुए कि एक वाक्य में केवल एक (प्राथमिक) भाषा है, आपको अभी भी उपरोक्त किसी भी कार्यान्वयन के साथ अच्छे परिणाम मिलना चाहिए।

ध्यान दें: एक वाक्य सीमा डिटेक्टर (SBD) सैद्धांतिक रूप से भाषा विशिष्ट (चिकन-अंडे की समस्या के बाद से आप एक के लिए दूसरे की जरूरत है) है। लेकिन लैटिन-स्क्रिप्ट आधारित भाषाओं (अंग्रेजी, फ़्रेंच, जर्मन इत्यादि) के लिए जो प्राथमिक रूप से सजा को सीमित करने के लिए अवधि (विस्मयादिबोधक आदि के अलावा) का उपयोग करते हैं, आप अंग्रेजी के लिए डिज़ाइन किए गए एसबीडी का उपयोग करते हुए भी स्वीकार्य परिणाम प्राप्त करेंगे। मैंने नियम-आधारित अंग्रेजी एसबीडी लिखा है जिसने फ्रेंच पाठ के लिए वास्तव में अच्छा काम किया है। कार्यान्वयन के लिए, OpenNLP पर एक नज़र डालें।

SBD का उपयोग कर के लिए एक वैकल्पिक विकल्प का कहना है की 10 टोकन (सफेद स्थान को सीमांकित) एक स्लाइडिंग विंडो का उपयोग करने के लिए एक छद्म वाक्य (पी एस) बनाने के लिए और कोशिश करते हैं और पहचान सीमा जहां भाषा परिवर्तन है। इसका नुकसान यह है कि यदि आपके पूरे दस्तावेज़ में एन टोकन हैं, तो आप प्रत्येक 10 लंबाई लंबाई के तारों पर लगभग एन -10 वर्गीकरण संचालन करेंगे। दूसरे दृष्टिकोण में, यदि औसत वाक्य में 10 टोकन हैं, तो आप लगभग एन/10 वर्गीकरण संचालन करेंगे। यदि किसी दस्तावेज़ में n = 1000 शब्द हैं, तो आप 9 0 ऑपरेशंस की तुलना कर रहे हैं 100 परिचालन बनाम: परिमाण अंतर का क्रम।


यदि आपके पास छोटे वाक्यांश (20 वर्णों के तहत) हैं, तो भाषा अनुभव की सटीकता मेरे अनुभव में खराब है। विशेष रूप से उचित संज्ञाओं के साथ-साथ संज्ञाएं जो "चॉकलेट" जैसी भाषाओं में समान हैं, के मामले में। जैसे क्या "न्यूयॉर्क" एक अंग्रेजी शब्द या फ्रांसीसी शब्द है यदि यह फ्रेंच वाक्य में दिखाई देता है?

0

बाइग्राम मॉडल अच्छा प्रदर्शन, प्रशिक्षित करने के लिए लिखने के लिए सरल, सरल हैं, और केवल पता लगाने के लिए पाठ की एक छोटी राशि की आवश्यकता है। नच भाषा पहचानकर्ता एक जावा कार्यान्वयन है जिसे हमने पाया और पतली आवरण के साथ प्रयोग किया जाता है।

हम मिश्रित CJK और अंग्रेजी पाठ के लिए एक बाइग्राम मॉडल के साथ समस्या नहीं थी (अर्थात ट्वीट ज्यादातर जापानी है, लेकिन एक भी अंग्रेज़ी शब्द है)। यह गणित को देखने से पूर्वदर्शी में स्पष्ट है (जापानी में कई और पात्र हैं, इसलिए किसी दिए गए जोड़ी की संभावनाएं कम हैं)। मुझे लगता है कि आप इसे कुछ और जटिल लॉग-रैखिक तुलना के साथ हल कर सकते हैं, लेकिन मैंने धोखा दिया और चरित्र सेटों के आधार पर एक साधारण फ़िल्टर का उपयोग किया जो कुछ भाषाओं के लिए अद्वितीय है (यानी यदि इसमें केवल एकीकृत हान है, तो यह चीनी है, अगर इसमें कुछ शामिल है जापानी काना और एकीकृत हान, फिर यह जापानी है)।

संबंधित मुद्दे