একটি ফাইলে সবচেয়ে ঘন ঘন শব্দগুলি সন্ধান করুন


34

আমি একটি টেক্সট ফাইলে 10 টি সাধারণ শব্দ খুঁজে পেতে, বলতে চাই। প্রথমত, সমাধানটি কীস্ট্রোকের জন্য অপ্টিমাইজ করা উচিত (অন্য কথায় - আমার সময়)। দ্বিতীয়ত, পারফরম্যান্সের জন্য। আমি এখন পর্যন্ত শীর্ষস্থানীয় 10 টি পেতে যা পেয়েছি তা এখানে:

cat test.txt | tr -c '[:alnum:]' '[\n*]' | uniq -c | sort -nr | head  -10
  6 k
  2 g
  2 e
  2 a
  1 r
  1 k22
  1 k
  1 f
  1 eeeeeeeeeeeeeeeeeeeee
  1 d

আমি একটি জাভা, পাইথন ইত্যাদি প্রোগ্রাম তৈরি করতে পারি যেখানে আমি একটি অভিধানে (শব্দ, সংখ্যাঅফিউচারেন্স) সঞ্চয় করি এবং মানটি বাছাই করতে পারি বা আমি মানচিত্রটি ব্যবহার করতে পারি তবে আমি কীস্ট্রোকের জন্য অনুকূলিত হয়েছি।

কোন মিথ্যা ইতিবাচক আছে? একটি ভাল উপায় আছে কি?


কেন আপনি শেষে একটি -10 রাখবেন? : পি
আনু

উত্তর:


47

এটি "এন সর্বাধিক সাধারণ জিনিস" সন্ধান করার সর্বাধিক সাধারণ উপায়, আপনি যদি কোনও মিস করছেন না sortএবং আপনি একটি কৃতজ্ঞ হন তবে cat:

tr -c '[:alnum:]' '[\n*]' < test.txt | sort | uniq -c | sort -nr | head  -10

আপনি যদি এর sortআগে কিছু না রাখেন তবে uniq -c আপনি সম্ভবত প্রচুর মিথ্যা সিঙ্গলটন শব্দ পাবেন। uniqকেবল অনন্যতম রেখাগুলিই চালায়, সামগ্রিক এককত্ব নয়।

সম্পাদনা: আমি একটি কৌশল ভুলে গিয়েছিলাম, "শব্দ বন্ধ করুন"। আপনি যদি ইংরেজী পাঠের দিকে তাকিয়ে থাকেন (দুঃখিত, একাকী উত্তর আমেরিকান এখানে), "অফ", "এবং", "" "এর মতো শব্দগুলি প্রায়শই শীর্ষ দুটি বা তিনটি স্থান নেয়। আপনি সম্ভবত এগুলি মুছে ফেলতে চান। জিএনইউ গ্রাফ বিতরণের একটি ফাইল eignরয়েছে যার মধ্যে স্টপ শব্দের একটি সুন্দর শালীন তালিকা রয়েছে। আমার আর্ক ডিস্ট্রোতে রয়েছে /usr/share/groff/current/eignতবে আমি মনে করি আমি পুরানো ইউনিক্সগুলিও দেখেছি /usr/share/dict/eignবা করেছি /usr/dict/eign

আপনি এই জাতীয় স্টপ শব্দ ব্যবহার করতে পারেন:

tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head  -10

আমার অনুমান যে বেশিরভাগ মানুষের ভাষাগুলির অনুরূপ "স্টপ শব্দের" অর্থবহ শব্দের ফ্রিকোয়েন্সি গণনা থেকে মুছে ফেলা প্রয়োজন, তবে আমি জানি না কোথায় অন্যান্য ভাষা শব্দের তালিকা থামিয়ে দেয়।

সম্পাদনা: কমান্ডটি fgrepব্যবহার করা উচিত -w, যা পুরো শব্দটির মিলটি সক্ষম করে। এটি "a" বা "i" এর মতো কেবল শর্ট স্টপ কাজ করে এমন শব্দের উপর মিথ্যা ইতিবাচক বিষয়গুলি এড়িয়ে চলে।


2
না catকিছু উল্লেখযোগ্য কর্মক্ষমতা ওভারহেড যোগ করতে চান? আমি পাইপ সিনট্যাক্স পছন্দ করি। '[\ N *]' এ * কী করে?
লুকাসজ ম্যাডন

1
আপনি যদি "বিড়াল টেস্ট.টেক্সট" পছন্দ করেন তবে সর্বদা এটি ব্যবহার করুন। আমি কোথাও একটি নিবন্ধ পড়েছি যেখানে ডেনিস রিচি বলেছেন যে "বিড়াল কিছু | কিছু কিছু" সিনট্যাক্সটি আরও ব্যাপকভাবে ব্যবহৃত হয় এবং এটি 'এককথায়' সিনট্যাক্সটি ভুল হওয়ার কিছু ছিল, কারণ এটি একক উদ্দেশ্য।
ব্রুস এডিগার

আমি যদি কোনও findআউটপুটে সর্বাধিক সাধারণ ডিরেক্টরি নামটি খুঁজতে চাই ? এটি হ'ল /স্পেস অক্ষরের পরিবর্তে শব্দগুলিকে বিভক্ত করুন এবং অনুরূপ।
erb

1
@ বার - আপনি সম্ভবত এরকম কিছু করতে পারেন:find somewhere optoins | tr '/' '\n' | sort | uniq -c | sort -k1.1nr | head -10
ব্রুস এডিগার

1
@ বার্ব - এটিকে প্রশ্ন হিসাবে জিজ্ঞাসা করুন, কোনও মন্তব্যে নয়। আপনার প্রশ্নটি ফ্রেম করার জন্য আপনার আরও জায়গা থাকবে, যাতে আপনার প্রয়োজনীয় উত্তরটি পেতে পারেন। উদাহরণ ইনপুট এবং পছন্দসই আউটপুট দিন। একটি ভাল প্রশ্ন জিজ্ঞাসার জন্য আপনি কিছু খ্যাতি পয়েন্ট পেতে পারেন, এবং আমি একটি মন্তব্যে আমার চেয়ে আরও ভাল উত্তর দেওয়ার জন্য পয়েন্ট পেতে পারি।
ব্রুস এডিগার


7

আসুন আমরা ব্যবহার করি!

এই ফাংশনটি নিম্নোক্ত ক্রমে প্রদত্ত ফাইলে সংঘটিত প্রতিটি শব্দের ফ্রিকোয়েন্সি তালিকা করে:

function wordfrequency() {
  awk '
     BEGIN { FS="[^a-zA-Z]+" } {
         for (i=1; i<=NF; i++) {
             word = tolower($i)
             words[word]++
         }
     }
     END {
         for (w in words)
              printf("%3d %s\n", words[w], w)
     } ' | sort -rn
}

আপনি আপনার ফাইলে এটি কল করতে পারেন:

$ cat your_file.txt | wordfrequency

এবং শীর্ষ 10 শব্দের জন্য:

$ cat your_file.txt | wordfrequency | head -10

সূত্র: এডাব্লুকে-ওয়ার্ড রুবি


4

আসুন হাস্কেল ব্যবহার করি!

এটি একটি ভাষা যুদ্ধে পরিণত হচ্ছে, তাই না?

import Data.List
import Data.Ord

main = interact $ (=<<) (\x -> show (length x) ++ " - " ++ head x ++ "\n")
                . sortBy (flip $ comparing length)
                . group . sort
                . words

ব্যবহার:

cat input | wordfreq

বিকল্পভাবে:

cat input | wordfreq | head -10

পরিবর্তিত সংস্করণ কেস উপেক্ষা করে: পেস্টবিন.com
এক্সেল লাটওয়ালা

ক্লাসিকের চেয়ে অনেক ধীর গতিতে কাজ করে sort | uniq -c | sort -nr
অ্যান্ড্রি মাকুখা

@ অ্যান্ড্রিআমাকুখা হ'ল বাধাটি হ্যাসকেলে চরিত্রের তালিকাযুক্ত। আমরা সি Textবা ByteStringতার পরিবর্তে স্যুইচ-এর মতো গতি পেতে পারি যা এটি যোগ্যতার সাথে আমদানি করার এবং কোয়ালিফায়ারের সাথে ফাংশনগুলির উপসর্গ করার মতোই সহজ।
ব্ল্যাকক্যাপ


3

পাইথন ব্যবহার করে এমন কিছু কাজ করা উচিত যা সাধারণত পাওয়া যায়:

cat slowest-names.log | python -c 'import collections, sys; print collections.Counter(sys.stdin);'

এটি প্রতি লাইনে শব্দ ধরেছে। যদি আরও কিছু থাকে তবে বিভাজনও সহজ হওয়া উচিত।


পাইথন 3 এবং আরও ভাল আউটপুটcat README.md | python -c 'import collections, sys, pprint; pprint.pprint(collections.Counter(sys.stdin));'
ম্যাডন

1

এটি একটি ক্লাসিক সমস্যা যা 1986 সালে কিছুটা অনুরণন পেয়েছিল, যখন ডোনাল্ড নুথ তার সাক্ষরিত প্রোগ্রামিং কৌশলটি চিত্রিত করার জন্য 8-পৃষ্ঠার দীর্ঘ প্রোগ্রামে হ্যাশ চেষ্টা করে একটি দ্রুত সমাধান কার্যকর করেছিলেন, যখন ইউনিক্স পাইপের গডফাদার ডগ ম্যাকল্রয় একটি প্রতিক্রিয়া দিয়েছিলেন। ওয়ান-লাইনার, এটি তত দ্রুত ছিল না, তবে কাজটি সম্পন্ন করেছে:

tr -cs A-Za-z '\n' | tr A-Z a-z | sort | uniq -c | sort -rn | sed 10q

অবশ্যই, ম্যাকিলারয়ের সমাধানের সময় জটিলতা ও (এন লগ এন) রয়েছে, যেখানে এন মোট শব্দ সংখ্যা। আরও দ্রুত সমাধান আছে। উদাহরণ স্বরূপ:

এখানে উপরের বাউন্ড টাইম জটিলতা ও ((এন + কে) লগ কে) সহ একটি সি ++ বাস্তবায়ন রয়েছে, সাধারণত - প্রায় রৈখিক।

নীচে হ্যাশ অভিধানের সাহায্যে দ্রুত পাইথন প্রয়োগকরণ এবং টাইম জটিলতা হে (এন + কে লগ কিউ) সহ হিপ রয়েছে, যেখানে কিউ বেশ কয়েকটি অনন্য শব্দ:

import collections, re, sys

filename = sys.argv[1]
k = int(sys.argv[2]) if len(sys.argv)>2 else 10

text = open(filename).read()
counts = collections.Counter(re.findall('[a-z]+', text.lower()))
for i, w in counts.most_common(k):
    print(i, w)

সিপিইউ সময়ের তুলনা (সেকেন্ডে):

                                     bible32       bible256
C++ (prefix tree + heap)             5.659         44.730  
Python (Counter)                     10.314        100.487
Sheharyar (AWK + sort)               30.864        251.301
McIlroy (tr + sort + uniq)           60.531        690.906

নোট:

  • বাইবেল 32 হ'ল বাইবেল নিজেই 32 বার (135 মেগাবাইট), বাইবেল 256 - 256 বার যথাক্রমে (1.1 গিগাবাইট) সংযুক্ত।
  • পাইথন স্ক্রিপ্টগুলির অ-লিনিয়ার ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে এই কারণে আসে যে এটি মেমরিতে সম্পূর্ণ ফাইলগুলি প্রক্রিয়া করে, তাই ওভারহেডগুলি বিশাল ফাইলগুলির জন্য বড় হয়ে উঠছে।
  • যদি এমন কোনও ইউনিক্স সরঞ্জাম ছিল যা গাদা তৈরি করতে পারে এবং স্তূপের শীর্ষ থেকে এন উপাদানগুলি তুলতে পারে, তবে এডাব্লু কে সমাধান প্রায় লিনিয়ার সময় জটিলতা অর্জন করতে পারে, যখন বর্তমানে এটি হে (এন + কিউ লগ কিউ) রয়েছে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.