<元の文章>
ウェブ上のコンテンツをそのまま自サイトに掲載すれば無断転載。当然やってはいけません。他のサイトに書かれていることは参考するにとどめて自分で文章を書きましょう。またリライト(書き換えた)つもりだったのに実は気がつかないうちにコピーしていた・・・なんてこともあります。
<リライトしたつもりの文章>
ウェブ上にあるコンテンツというものをそのままの状態で自サイトに掲載するような行為を無断転載といいます。当然こんなことはやってはなりません。他人のサイトの内容は参考程度に考えて自分の力で文章というものは書くべきものです。またリライトというか内容は書き換えたはずなのに、実際には気づかないあいだにコピーしていたという信じられないこともあるそうです。
2番目の文章は1番目の文章の単語のあいだに適当に単語をいれただけです。そのため冗長な文章になっています。3gramを使った判定ではコピペ率は32%なのですが、別のコピペチェックサイトを使うと、もっと厳しい数字がでてきます。
ここでの判定結果は63.18%でした。やっぱり適当にリライトしただけあって厳しい結果になりました。
文章類似度算出(速攻ハック版)の説明によるとsimilar_text()に投げる前に、kakasiで簡単に形態素解析しているそうです。形態素解析は当サイトでもやりました。
ところで
① ウェブ上のコンテンツをそのまま自サイトに掲載するのは無断転載です。
② ウェブ上にあるコンテンツというものをそのままの状態で自サイトに掲載するような行為を無断転載といいます。
①の文は普通ですが、②の文は余計な言葉をつけたして文章の水増しをしています。
形態素解析で重要度の高い単語のみを抽出することで、上記の2文が同じ意味の文である(コピペ文)であることを見抜くことはできるのでしょうか?
まず①を形態素解析するとこうなります。
ウェブ(名詞)
上(接尾辞)
の(助詞
コンテンツ(名詞)
を(助詞)
そのまま(副詞)
自(名詞)
サイト(名詞)
に(助詞)
掲載(名詞)
する(助動詞)
の(助詞)
は(助詞)
無断(名詞)
転載(名詞)
です(助動詞)
②は以下のようになります。
ウェブ(名詞)
上(接尾辞)
に(助詞)
ある(動詞)
コンテンツ(名詞)
と(助詞)
いう(動詞)
もの(名詞)
を(助詞)
そのまま(名詞)
の(助詞)
状態(名詞)
で(助詞)
自(名詞)
サイト(名詞)
に(助詞)
掲載(名詞)
する(助動詞)
よう(助詞)
な(助動詞)
行為(名詞)
を(助詞)
無断(名詞)
転載(名詞)
と(助詞)
いい(動詞)
ます(助動詞)
①にはなく②にあるのは以下のような単語です。
いう(動詞)
そのまま(名詞)
状態(名詞)
行為(名詞)
あまり文の意味とは関係のない単語です。「無断転載」がどのようなものなのかについて説明するなら、もっと使うべき単語があるはずです。①に対して②は文字数が多いだけです。②は無意味に長いだけの駄文なのです。
ではこのような小手先のコピペ文章を見破るにはどうすればいいのでしょうか?
今回は形態素解析を使います。元の文と新しく作成された文に対して形態素解析をして、どのような単語が使われているのかを調べます。また単語は「原型」で評価します。
まずはテキストを形態素解析します。そして結果が返ってきたらWordInfoクラスに単語、原型、品詞名を格納してリストを作ります。
1 2 3 4 5 6 |
public class WordInfo { public string surface = ""; // 単語 public string baseform = ""; // 原型 public string pos = ""; // 品詞 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
public partial class Form1 : Form { List<WordInfo> GetWordInfos(string str) { List<WordInfo> wordInfos = new List<WordInfo>(); string url = "https://jlp.yahooapis.jp/MAService/V1/parse"; System.Net.WebClient wc = new System.Net.WebClient(); //NameValueCollectionの作成 var ps = new System.Collections.Specialized.NameValueCollection(); //送信するデータ(フィールド名と値の組み合わせ)を追加 ps.Add("appid", myYahooID); ps.Add("sentence", str); ps.Add("results", "ma"); if(GetResponses() != "") ps.Add("response", GetResponses()); if(Getfilters() != "") ps.Add("filter", Getfilters()); //データを送信し、また受信する byte[] resData = wc.UploadValues(url, ps); wc.Dispose(); //受信したデータを表示する string resText = System.Text.Encoding.UTF8.GetString(resData); var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(resText); var nodes = xmlDoc.SelectNodes("//*[local-name()='word']"); foreach(XmlNode node in nodes) { XmlNode node1 = node.SelectSingleNode("*[local-name()='surface']"); XmlNode node2 = node.SelectSingleNode("*[local-name()='pos']"); XmlNode node3 = node.SelectSingleNode("*[local-name()='baseform']"); WordInfo info = new WordInfo(); if(node1 != null) info.surface = node1.InnerText; if(node2 != null) info.pos = node2.InnerText; if(node3 != null) info.baseform = node3.InnerText; wordInfos.Add(info); } return wordInfos; } string GetResponses() { List<string> responses = new List<string>(); responses.Add("surface"); responses.Add("pos"); responses.Add("baseform"); return String.Join(",", responses); } string Getfilters() { List<string> filters = new List<string>(); // 形容詞 形容動詞 名詞 動詞 を取得 filters.Add("1"); filters.Add("2"); filters.Add("9"); filters.Add("10"); // 感動詞 副詞 連体詞 接続詞 接頭辞 接尾辞 も取得する if(checkBox1.Checked) { filters.Add("3"); filters.Add("4"); filters.Add("5"); filters.Add("6"); filters.Add("7"); filters.Add("8"); } // 助詞 助動詞 特殊(句読点、カッコ、記号など)も取得する if(checkBox2.Checked) { filters.Add("11"); filters.Add("12"); filters.Add("13"); } return String.Join("|", filters); } } |
リストを作成したら新しく作成した文章のなかには存在するけど元の文書のなかには存在しない単語(リライトによって新しく追加された単語)の数を調べます。これと新しく作成した文章内の総単語数を比較すればコピペ率がわかります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { int SimilarRateFromWord(string oldText, string newText) { List<WordInfo> oldWords = GetWordInfos(oldText); List<WordInfo> newWords = GetWordInfos(newText); List<string> vs = new List<string>(); foreach(var info in newWords) { if(! oldWords.Any(x => x.baseform == info.baseform)) vs.Add(info.baseform); } return 100 - 100 * vs.Count / newWords.Count; } private void button4_Click(object sender, EventArgs e) { int similarRate = SimilarRateFromWord(richTextBox1.Text, richTextBox2.Text); string str = String.Format("コピペ率は {0} %です", similarRate); MessageBox.Show(str); } } |
<元の文章>
ウェブ上のコンテンツをそのまま自サイトに掲載すれば無断転載。当然やってはいけません。他のサイトに書かれていることは参考するにとどめて自分で文章を書きましょう。またリライト(書き換えた)つもりだったのに実は気がつかないうちにコピーしていた・・・なんてこともあります。
<リライトしたつもりの文章>
ウェブ上にあるコンテンツというものをそのままの状態で自サイトに掲載するような行為を無断転載といいます。当然こんなことはやってはなりません。他人のサイトの内容は参考程度に考えて自分の力で文章というものは書くべきものです。またリライトというか内容は書き換えたはずなのに、実際には気づかないあいだにコピーしていたという信じられないこともあるそうです。
3gramを使った判定ではコピペ率は32%ですが、今回作成したコピペチェックアプリでは65%になりました。やっぱり小手先はダメですね。文章は自分で考えましょう。