2012-11-02 15 views
6

मैं एक mysql डेटासेट पर सबसे अधिक इस्तेमाल किए गए शब्दों को निर्धारित करने के बारे में जानने का प्रयास कर रहा हूं।शब्दों का सबसे अधिक इस्तेमाल किया गया सेट php mysql

यह सुनिश्चित नहीं है कि इस बारे में कैसे जाना है या यदि कोई आसान दृष्टिकोण है। कुछ पोस्ट पढ़ें जहां कुछ एल्गोरिदम सुझाते हैं।

उदाहरण:

24,500 से रिकॉर्ड, पता लगाने के शीर्ष 10 शब्दों का इस्तेमाल किया।

+2

क्या आप एकाधिक शब्दों वाले एक फ़ील्ड से डेटा का विश्लेषण कर रहे हैं? थोड़ा और जानकारी उपयोगी होगी। – Tom

+0

हां, एकाधिक शब्द तारों के साथ एकल फ़ील्ड (कॉलम)। – Codex73

+0

मैंने php स्क्रिप्ट में कुछ ऐसा ही किया है। यकीन नहीं है कि मैं इसे एक एकल SQL कथन में करने का प्रयास करूंगा। एक समस्या कॉलम को शब्दों में विभाजित कर रही है और प्रत्येक को एक पंक्ति के रूप में लौट रही है (मैंने इसके लिए नियमित अभिव्यक्ति का उपयोग किया), लेकिन फिर शब्दों के बीच ब्रेक के रूप में आप किस चीज की देखभाल करते हैं, और यह भी कि आप बहुवचन के साथ कैसे निपटना चाहते हैं आप उन्हें एक ही शब्द या 2 अलग-अलग शब्दों के रूप में व्यवहार करना चाहते हैं)। कॉलम को शब्दों में विभाजित करने, एकाधिक पंक्तियों को वापस करने के लिए, फिर कुछ एसक्यूएल के भीतर से गणना या घटनाओं के लिए इसका उपयोग करके MySQL फ़ंक्शन लिखना सबसे आसान हो सकता है। – Kickstart

उत्तर

13

ठीक है, यह एक कुत्ते की तरह चलता है और एक ही डिलीमीटर के साथ काम करने तक ही सीमित है, लेकिन उम्मीद है कि आपको एक विचार मिलेगा।

SELECT aWord, COUNT(*) AS WordOccuranceCount 
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(SomeColumn, ' '), ' ', aCnt), ' ', -1) AS aWord 
FROM SomeTable 
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt 
FROM integers a, integers b, integers c) Sub1 
WHERE (LENGTH(SomeColumn) + 1 - LENGTH(REPLACE(SomeColumn, ' ', ''))) >= aCnt) Sub2 
WHERE Sub2.aWord != '' 
GROUP BY aWord 
ORDER BY WordOccuranceCount DESC 
LIMIT 10 

यह एक एकल स्तंभ मान के साथ 10 पंक्तियों के साथ मैं कहा जाता है के साथ एक मेज पूर्णांक कहा होने पर निर्भर करता 0 9 को यह करने के लिए ~ 1000 शब्दों के साथ copes लेकिन आसानी से अधिक से निपटने के लिए बदला जा सकता है (लेकिन और भी धीमा हो जाएगा)।

1

सामान्य विचार यह पता लगाने के लिए होगा कि प्रत्येक क्षेत्र में कितने डिलीमीटर (उदा। रिक्त स्थान) हैं, और प्रत्येक ऐसे क्षेत्र के लिए SUBSTRING_INDEX() को लूप में चलाएं। इसे अस्थायी तालिका में पॉप्युलेट करने से समानांतर में भाग में इसे चलाने में सक्षम होने का अतिरिक्त लाभ होता है। ऐसा करने के लिए कुछ एसपी को एक साथ फेंकना बहुत बोझिल नहीं होना चाहिए।

+0

हम्म ... ऐसा लगता है [किसी और] (http://www.montrealseocompany.com/2012/04/17/mysql-split-string-into-rows-function/) पहले से ही इसे चेन करने की परेशानी में चला गया है एक साथ चीज की तरह। – fenway

4

PHP में यह सब क्यों नहीं करते? कदम होगा

  1. एक शब्दकोश (शब्द => गिनती) बनाएं
  2. PHP में आप डेटा पढ़ें
  3. शब्दों में यह विभाजन
  4. शब्दकोश में प्रत्येक शब्द जोड़ें (आप लोअरकेस चाहते हो सकता है और ट्रिम उन्हें पहले)
  5. यदि पहले से ही शब्दकोश में है, तो इसकी गणना बढ़ोतरी करें। यदि नहीं पहले से ही शब्दकोश में, 1 अपने मूल्य के रूप में स्थापित (गिनती = 1)
  6. अपने तत्वों शब्दकोश दोहराएं उच्चतम 10 मूल्यों को खोजने के

मैं एसक्यूएल में ऐसा नहीं होता जिसका मुख्य कारण यह अंतत: अधिक जटिल।

+0

मैं इस दृष्टिकोण का सुझाव देता हूं, आप सामान्य रूप से प्रयुक्त शब्दों जैसे "है, था, द, ए" इत्यादि के लिए कुछ फ़िल्टर भी जोड़ सकते हैं, क्योंकि यदि आपने डेटाबेस से गहराई से गणना की है तो आप आमतौर पर इस्तेमाल किए गए शब्दों के साथ समाप्त हो सकते हैं सूची के शीर्ष। – Samy

+0

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

0

एक छोटी सी में सुधार, रोक शब्दों के साथ और Sub2.aWord सूची से हटाने (स्टॉप शब्दों की सूची) में नहीं

SELECT aWord, COUNT(*) AS WordOccuranceCount 
FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(concat(txt_msg, ' '), ' ', aCnt), ' ', -1) AS aWord 
FROM mensagens 
CROSS JOIN (
SELECT a.i+b.i*10+c.i*100 + 1 AS aCnt 
FROM integers a, integers b, integers c) Sub1 
WHERE (LENGTH(txt_msg) + 1 - LENGTH(REPLACE(txt_msg, ' ', ''))) >= aCnt) Sub2 
WHERE Sub2.aWord != '' AND Sub2.aWord not in ('a','about','above', .....) 
GROUP BY aWord 
ORDER BY WordOccuranceCount DESC 
LIMIT 10 
1
SELECT `COLUMNNAME`, COUNT(*) FROM `TABLENAME` GROUP BY `COLUMNNAME` 

अपने बहुत ही सरल और काम किया ... :)

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