In [55]:
"""
Load search data
"""
import cPickle
results = cPickle.load(open('tmp/results.pickle', 'r'))
In [56]:
"""
Extract web corpus
文節ユニグラム。以下で取得
http://s-yata.jp/corpus/nwc2010/ngrams/
"""
import math
corpus = {}
with open('tmp/1gm-0000', 'r') as f:
for line in f.readlines():
word, number = line.split('\t')
word = word.decode('utf8')
# Take a log of the frequency to prepare for tf-idf
number = math.log(int(number))
corpus[word] = number
In [72]:
"""
Pre-processing functions
"""
import MeCab as mecab
HIRAGANA = [unichr(i) for i in xrange(12353,12353+86)]
HIRAGANA_STR = ''.join(HIRAGANA)
EXCLUDE_LIST = [
"、",
"◯",
"✕",
"「",
"」",
"(",
")",
"(",
")",
".",
",",
"-",
":",
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"!",
"?",
"%",
"*",
"+",
"=",
"~",
"-",
"_",
"&",
"[",
"]"
]
def is_all_hiragana(s):
for c in s:
if c not in HIRAGANA_STR:
return False
return True
def is_to_exclude(s):
for e in EXCLUDE_LIST:
if e in s:
return True
s = s.decode('utf8')
if is_all_hiragana(s):
return True
return False
def parser(text):
"""形態素パーサ
名詞と形容詞を返す。
また、is_to_excludeで指定された近視語を考慮する。
"""
tagger = mecab.Tagger()
text = unicode(text)
encoded_text = text.encode('utf-8')
node = tagger.parseToNode(encoded_text)
while node:
pos = node.feature.split(",")[0]
if pos in ["名詞", "形容詞"] and not is_to_exclude(node.surface):
yield node.surface.decode('utf-8')
node = node.next
def get_tfidf(article):
"""Function for calculating tf-idf with DF taken from the Web corpus
"""
features = {}
for word in parser(article):
df = corpus.get(word, None)
if df:
tf = article.count(word)
features[word] = 1.0 * tf / df
else:
continue
return sorted(features.items(), key=lambda x: x[1], reverse=True)
In [74]:
"""
Compare to the original to create suggestions
"""
original = u"""
60秒で元気になれる耳寄りヘルスケア
2014.7.8
「すごくつらい訳ではないけど、毎日どことなくだるい」「足腰が弱くなった」「朝がつらい」
20代後半から忍び寄る「疲れ」という名の万病の元、皆さんも少なからず経験があるのではないでしょうか? 「病気」とは診断されず、また健康診断でも再検査を受けるほどではない、でもつらい疲れの解消には、肝臓と腎臓の回復が効果的です。
倦怠感や頭が重い症状の解消(肝臓回復)
早起きが苦手な人によく見られるのが、肝臓が弱っているというケースです。肝臓は身体の解毒をしているのですが、疲れがたまっているということは、この解毒がうまくいかず老廃物が溜まっている可能性があります。肝臓の機能を回復させるには、以下の食材が効果を発揮します。
・イカ、貝類、魚
栄養ドリンクで必ずといっていいほどうたわれている「タウリン」は、肝臓の細胞の回復を促進します。イカ、貝類、魚には、このタウリンが自然の状態で豊富に含まれています。
・ささみ、魚、大豆
肝臓を修理する材料となる、良質なアミノ酸とタンパク質をとることができます。
・青魚、くるみ、えごま油
肝臓の負担になっているのが、コレステロール。青魚、くるみ、えごま油には、コレステロールを排出させる「オメガ3脂肪酸」が豊富に含まれています。このオメガ3脂肪酸は限られた食材にしか豊富には含まれず、常に不足しがちな栄養成分ですので、意識して摂取してみてください。
倦怠感やむくみの調整(腎臓回復)
病気になってもはっきりとした自覚症状が現れにくいため「沈黙の臓器」といわれる腎臓ですが、やはり疲れているとだるさやむくみが発生しやすくなるので、早めのケアが肝腎です。
※ここで挙げるのは腎臓回復の食事なので、腎臓病の方には当てはまりません!
・果物、野菜
果物や野菜に含まれるカリウムが、身体の水分調整や老廃物の排出を手伝います。これからの季節では、スイカなどがカリウムを多く含む食材の代表格です。
・くるみ、ゴマ
中国医学で「腎精」(腎臓を元気にする)と称されるほど、腎臓の健康に役立つと言われています。腎臓は血液のろ過をする器官ですが、くるみやゴマは血液の流れを良くし、老廃物の排出を促すことで腎臓の回復力を高めます。
・山芋、自然薯、ごぼう、レンコン
根菜や芋類にはカリウムと食物繊維が多く含まれており、この2つの成分が動物性の老廃物を排出する手助けをしてくれます。ただし、腎臓病などでカリウムの摂取制限が必要な場合は、根菜や芋類は避けてください。
"""
top_terms = set()
# Look for the defining terms in top 20 ranked pages
for result in results:
for page in result.results[:20]:
top = get_tfidf(page.body)[:5]
for item in top:
word = item[0]
if word not in top_terms and word not in original:
top_terms.add(word)
print(u', '.join(top_terms))
In [75]:
"""
検索ワード毎に、その中での特徴量を取ってみる
(同じ検索ワードで表示されるページはもともと似ているから、tf-idfの母集団をWeb全体ではなく検索結果に限定してみる)
"""
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(analyzer=parser)
first = results[0]
texts = [page.body for page in first.results]
x = vectorizer.fit_transform(texts)
terms = vectorizer.get_feature_names()
tfidfs = x.toarray()
print(tfidfs)
In [76]:
"""
各記事のtfidfトップ3の単語を使い、オリジナルの記事にない単語をピックアップ
"""
top_terms = set()
for page_tfidf in tfidfs:
# get indices
indices = [i[0] for i in sorted(enumerate(page_tfidf), key=lambda x:x[1], reverse=True)]
# get top 3
top = [terms[i] for i in indices[:3]]
for term in top:
if term not in top_terms and term not in original:
top_terms.add(term)
print(u', '.join(top_terms))
In [ ]: