Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

我自定义的字典,词的权重不会发生改变呢 #51

Closed
f1120309265 opened this issue Jan 11, 2019 · 8 comments
Closed

我自定义的字典,词的权重不会发生改变呢 #51

f1120309265 opened this issue Jan 11, 2019 · 8 comments

Comments

@f1120309265
Copy link

f1120309265 commented Jan 11, 2019

我载入了自定义字典,想对部分词的权重进行提升,但是实际结果该词的权重并没有收到任何影响。
举个栗子: 我没有在自定义词库里添加销量这个词的时候,它分出来的权重值是0.061093127894683,如下图1
image1
(图1)
然后我把销量这个词加入自定义词库,权重设为100,再进行分词,结果还是这个,丝毫不受影响,如下图2
image2
(图2)
这是我的自定义字典userdict.txt的内容,图3
image4
(图3)
这是我的代码,图4
image3
(图4)
请问这是为什么呢

@fukuball
Copy link
Owner

@f1120309265 你可以提供一下這個例子的 $content 嗎?

@fukuball
Copy link
Owner

@f1120309265 我仔細看一下 jieba 目前的實作邏輯,自定義詞庫的權重影響的是斷詞切分的組合,跟取出關鍵字的 tf/idf 並無關係,如果你有調整關鍵字權重的需求,我可能要另外實作方法,而且也不是用自定義詞庫來調,可能就提供發法在 run time 中去調整 tf/idf 值。

@fukuball
Copy link
Owner

剛剛仔細看源碼,應該不用實作新方法就可以達到您的需求,提供一個範例在下面。

@fukuball
Copy link
Owner

@f1120309265 提供一個範例給你:

$content = "汽车行业巨头大众汽车最新公布2018年销售数据,全年共销售汽车624万辆,创历史新高。尽管如此,总体销量较2017年只是小幅增长0.2%,尤其是下半年受贸易问题和欧洲排放标准的影响,销量增速快速恶化。";

$tags = JiebaAnalyse::extractTags($content, 10);
var_dump($tags);

Jieba::loadUserDict(dirname(dirname(__FILE__)).'/dict/user_dict.txt');

$tags = JiebaAnalyse::extractTags($content, 10);
var_dump($tags);

JiebaAnalyse::$idf_freq['销售数据'] = 20;
$tags = JiebaAnalyse::extractTags($content, 10);
var_dump($tags);

Output 的結果:

array(10) {
  ["销量"]=>
  float(0.38517762539314)
  [624]=>
  float(0.34156478579714)
  ["0.2"]=>
  float(0.34156478579714)
  [2017]=>
  float(0.34156478579714)
  [2018]=>
  float(0.34156478579714)
  ["销售"]=>
  float(0.30390049575086)
  ["大众汽车"]=>
  float(0.284269540954)
  ["汽车行业"]=>
  float(0.24650508838314)
  ["尽管如此"]=>
  float(0.23087413490343)
  ["巨头"]=>
  float(0.21458391385457)
}
array(10) {
  ["销量"]=>
  float(0.39650637908118)
  [624]=>
  float(0.35161080890882)
  ["0.2"]=>
  float(0.35161080890882)
  [2017]=>
  float(0.35161080890882)
  [2018]=>
  float(0.35161080890882)
  ["销售数据"]=>
  float(0.35161080890882)
  ["大众汽车"]=>
  float(0.29263040980559)
  ["汽车行业"]=>
  float(0.25375523804147)
  ["尽管如此"]=>
  float(0.23766455063588)
  ["巨头"]=>
  float(0.22089520543853)
}
array(10) {
  ["销售数据"]=>
  float(0.58823529411765)
  ["销量"]=>
  float(0.39650637908118)
  [624]=>
  float(0.35161080890882)
  ["0.2"]=>
  float(0.35161080890882)
  [2017]=>
  float(0.35161080890882)
  [2018]=>
  float(0.35161080890882)
  ["大众汽车"]=>
  float(0.29263040980559)
  ["汽车行业"]=>
  float(0.25375523804147)
  ["尽管如此"]=>
  float(0.23766455063588)
  ["巨头"]=>
  float(0.22089520543853)
}

@fukuball
Copy link
Owner

@f1120309265 從上面的範例,我們可以看到加了自定義字典之後,Jieba 可以斷出想要的結果,但是關鍵字的分數則不受影響(自定義字典中的權重意義上只是為了改善斷詞結果,而不是更改關鍵字演算結果),因為在正常情況下,我們不應該任意調整關鍵字演算法的權重計算結果。

但當有特別想要調整的關鍵字權重,我們還是可以使用 JiebaAnalyse::$idf_freq['關鍵字'] = 權重; 例如 JiebaAnalyse::$idf_freq['销售数据'] = 20; 來調整關鍵字權重結果,來對特定字詞調整 idf 值會比較符合你的使用情境,在意義上也會比較對。

@f1120309265
Copy link
Author

okay,谢谢解答。
我需要 调整权重的词比较多,所以继承MyJiebaAnalyse类,添加了一个方法,自己载入idf文件,与默认的合并,这样就解决了权重的问题。

@sj8354661
Copy link

okay,谢谢解答。
我需要 调整权重的词比较多,所以继承MyJiebaAnalyse类,添加了一个方法,自己载入idf文件,与默认的合并,这样就解决了权重的问题。

请问您写的这个方法可以分享一下么?我也有同样的需求!~

@f1120309265
Copy link
Author

f1120309265 commented Aug 23, 2019

okay,谢谢解答。
我需要 调整权重的词比较多,所以继承MyJiebaAnalyse类,添加了一个方法,自己载入idf文件,与默认的合并,这样就解决了权重的问题。

请问您写的这个方法可以分享一下么?我也有同样的需求!~

代码如下,有问题再随时探讨沟通
`use Fukuball\Jieba\JiebaAnalyse;

class MyJiebaAnalyse extends JiebaAnalyse
{
public static function init($options = array())
{
parent::init($options = array());
}

public static function setIdf($idf_path)
{
    $content = fopen($idf_path, "r");
    while (($line = fgets($content)) !== false) {
        $explode_line = explode(" ", trim($line));
        $word = $explode_line[0];
        $freq = $explode_line[1];
        $freq = (float) $freq;
        $idffreq[$word] = $freq;
        self::$idf_freq[$word] = $freq;
    }
    fclose($content);
    asort(self::$idf_freq);
    $keys = array_keys(self::$idf_freq);
    $middle_key = $keys[count(self::$idf_freq)/2];
    self::$max_idf = max(self::$idf_freq);
    self::$median_idf = self::$idf_freq[$middle_key];
}

}`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants