WebSpiderからテキストファイルの出力があります。スパイダーは与えられたURLのリストからすべての文を抽出します。私がしなければならないのは、このファイルを処理し、65文字以上の文字を含むすべての行を見つけて、各行の言語を決定することです。一行で動作するようにしました(私のbashスクリプト技術は存在しません)。
sed -n '/^.\{65\}/p' www.mbl.is | langid --line | grep is
langid は言語を識別し、その言語の可能性に関連する数値を提供するPythonモジュールです。インストールするには、以下を実行してください。
pip install langid
または訪問https://github.com/saffsd/langid.py、詳細をご覧ください。今私がしなければならないのは、「is」とgrepを含むlangidコマンドにパイプで接続された行を印刷することです。以下は、現在のコマンドの出力例です。
('is', -288.34235095977783)
('is', -168.52833652496338)
('is', -255.30311250686646)
('is', -254.8700122833252)
('is', -664.7349543571472)
('is', -169.40936374664307)
('is', -315.0590629577637)
('is', -323.49001693725586)
('is', -281.2222490310669)
('is', -198.52733993530273)
('is', -152.1551775932312)
('is', -66.93532514572144)
('is', -231.61306524276733)
('is', -254.00042057037354)
('is', -322.7330708503723)
('is', -151.84487915039062)
編集:によるとテデンコメント
注文する:
sed -n '/^.\{65\}/p' www.mbl.is
出力:
Eftir stutt stopp i hofudborginni sem okkur heilt yfir leist agaetlega a var kominn timi a ad graeja visa fyrir Vietnam. 1
I gaer, paskadag, eyddum vid thvi deginum i ad koma okkur fyrir a Back Home, gerdum god kaup a Petaling Street (chinatown) og forum i paskaeggjaleit. 1
Vid, temmilega nyvoknud, stigum ut ur rutunni thar sem klassisku leigubilstjornarnir standa fyrir utan ad berjast um folk i bilana sina. 1
Vid forum med Boraj og Tino og leigdum okkur hljodeinangrad einkaherbergi med ollu innifoldu i klukkutima, fyrir taepa 20 dollara (1/4 af manadarlaunum theirra!) - fullt af bjor, starfsmadur med okkur allan timan og steiktar poddur i snakk med idyfum. 1
Vid ludarnir i "Good morning Vietnam" bolunum okkar umkringd moldriku folki klaett i italkst fra toppi og nidur. 1
Vid aetlum tho rett ad vona ad foreldrar okkar sjai ser faert ad geyma eins og eitt alvoru paskaegg handa hvoru okkar? 1
Hinsvegar var okkur bent a tyndu perluna, Mai Chau, sem hefur allt sem Sapa hefur upp a ad bjoda, nema thu dregur turismann fra. 1
Thetta var audvitad allt saman hreinasta lygi en vid letum okkur hafa thad og gistum eina nott a thessu annars agaeta hoteli. 1
Individual truth is constantly evolving, and a truth seeker must be willing to give up last week's major truth for whatever new discovery the innermost self reveals. 1
Um kvoldid forum vid svo oll saman ad borda vid mekong ana og attum mjog gott kvold saman. 1
Tha segja teir enn fremur ad bandarikjamenn hafi i raun verid ad reyna ad hindra frekari utbreidslu kommunisma i SA-Asiu, svo ad stridid var i raun bara einn stor misskilningur. 1
注文する:
sed -n '/^.\{65\}/p' www.mbl.is | langid --line
出力:
('en', -193.52840971946716)
('en', -445.4644522666931)
('en', -158.1918339729309)
('en', -220.16202330589294)
('en', -596.61936211586)
('en', -379.3824007511139)
('en', -150.61454391479492)
('en', -379.3824007511139)
('en', -270.56594038009644)
('en', -446.9800910949707)
('en', -702.9869554042816)
('en', -208.84209847450256)
('en', -345.15056800842285)
('en', -321.2763195037842)
('en', -209.9769265651703)
('en', -144.31591272354126)
('en', -208.40711855888367)
('en', -161.14595460891724)
('en', -180.95807218551636)
('is', -151.84487915039062)
('en', -32.042465686798096)
('no', -73.23809719085693)
('lb', -194.81272649765015)
('et', -80.76274251937866)
('en', -129.17673206329346)
('en', -95.43238878250122)
('da', -30.086124420166016)
これは一行で行うことができますか、それともスクリプトを書く方が良いですか? Pythonではこれを行うことができますが、正規表現モジュールは痛みを伴い、入力ファイルに基づいて文字変数をすばやく変更し、grepを他の言語コードに簡単に変更する必要があります。また、今このbashスクリプトの旅を始めるのに良い時期だと思います。 bashコマンドは優れており、bashスクリプトも同様であると仮定できます(ただし、意味論と構文、多くの$記号を理解するだけです)。
答え1
whileループを使用してこれを行うことができます。
while read l; do
[ ${#l} -gt 65 ] && \
echo "$l" | langid --line | grep -q "is" && \
echo "$l"
done <file
read l
入力を1行ずつ読み、現在の行を変数に保存します$l
。[ ${#l} -gt 65 ]
行に65文字を超える場合。echo "$l" | langid --line | grep -q "is"
この行を処理するには、grep
言語の場合は自動的に処理-q
されますgrep
。文字列が存在するかどうかを確認したい、出力はありません。echo "$l"
文字列がある場合、元の行が印刷されます。
<file
コンテンツをfile
入力として使用します。
編集する:上記のlangid
コマンドは、各行でコマンドを実行するのに非常に遅いです。 1回の転送で(より速く)実行するには、次のようにします。
awk 'FNR==NR{a[NR]=$0}
FNR!=NR&&$1~"is"{print a[FNR]}' \
<(sed -n '/^.\{65\}/p' file) \
<(sed -n '/^.\{65\}/p' file | langid --line)
awk
2つの「ファイル」が処理される。- 出力
sed -n '/^.\{65\}/p' file
:65文字以上のすべての文。 - 出力は、
sed -n '/^.\{65\}/p' file | langid --line
1回の転送で65文字以上の文字を含むすべての行を処理します。
- 出力
- 中
awk
:FNR==NR
最初の「ファイル」に適用a[NR]=$0
行番号をインデックスとして使用して配列を埋めるFNR!=NR&&$1~"is"
2番目の「ファイル」を操作し、行に文字列が含まれていることを確認します。is
print a[FNR]
a
その場合は、元の文を含む以前に作成された配列からその行を印刷します。
答え2
シェルがbashの場合は、次のことができます。
sed -n '/^.\{65\}/p' www.mbl.is | while read line ; do
LANGID=$(echo "$line" | langid --line)
if [[ "$LANGID" =~ is ]] ; then
echo "$line: $LANGID"
fi
done
langid
ただし、これは複数のインスタンス(各入力行に1つずつ)を実行するため、非常に遅くなります。 Githubの追加情報に記載されているように、langidを取得するPythonスクリプトを作成する方が良いかもしれません。上記のように、stdinを読み込み、それをstdinに渡す単純なループがトリックをlangid.classify()
実行します。
私のPythonは非常に錆びており、langid.pyがインストールされていないのでテストされていませんが、以下は非常に原始的なPythonの例です.
#! /usr/bin/python
import langid, fileinput, re
for line in fileinput.input():
if len(line) > 65:
id = langid.classify(line)
if re.match(r'is',id):
print line, ": ", id
コンパイルテストに合格しましたが、python -m py_compile langtest.py
それが私が有利だと言うことができるすべてです。
Frost Softwareによって追加された内容:
はるかに改善されており、おそらくテストされて動作するバージョンです。
#! /usr/bin/python
import sys, codecs, re
from fileinput import input as file
from langid import classify
#Output STDOUT as UTF-8
sys.stdout = codecs.getwriter("utf8")(sys.stdout)
sys.stderr = codecs.getwriter("utf8")(sys.stderr)
#read text as a positional argument and procss each line
for line in file():
#check if line is greater than 65 characters
if len(line) > 65:
#determine the language of each line
id = classify(line)
#check if language is Icelandic
if re.search('is', str(id)):
#print the line and the langid classification
print line, ": ", id
パラメータといくつかのアドインを可能にするより包括的なPythonスクリプトもあります。ポイントコード